本帖最后由 匿名 于 2020-12-16 12:27 编辑
[quote]匿名者 发表于 2020-12-16 09:02
第一题最近城市,用TreeMap:
- String[] findNearestCities(String[] ns, ...[/quote]
- 终于搞定第一题:
- [code] public String[] findNearestCities(int numOfPoints,
- String[] ns,
- int[] xs,
- int[] ys,
- int numOfQueries,
- String[] qs) {
- TreeMap<Integer,TreeMap<Integer, List<String>>> xyMap=new TreeMap<>();
- TreeMap<Integer,TreeMap<Integer,List<String>>> yxMap=new TreeMap<>();
- Map<String,int[]> npMap=new HashMap<>();
- int size=ns.length;
- for(int i=0;i<size;i++){
- int x=xs[i];
- int y=ys[i];
- String n=ns[i];
- TreeMap<Integer,List<String>> yMap=xyMap.getOrDefault(x,new TreeMap<>());
- List<String> tmp1=yMap.getOrDefault(y,new ArrayList<>());
- tmp1.add(n);
- yMap.put(y,tmp1);
- xyMap.put(x,yMap);
- TreeMap<Integer,List<String>> xMap=yxMap.getOrDefault(y,new TreeMap<>());
- List<String> tmp2=xMap.getOrDefault(x,new ArrayList<>());
- tmp2.add(n);
- xMap.put(x,tmp2);
- yxMap.put(y,xMap);
- npMap.put(n,new int[]{x,y});
- }
- String[] dest=new String[qs.length];
- for(int i=0;i<qs.length;i++) {
- String n=qs[i];
- int[] p=npMap.get(n);
- if(p==null) continue;
- // check the same x
- TreeMap<Integer,List<String>> yMap=xyMap.get(p[0]);
- List<String> same=yMap.get(p[1]);
- if (same.size()>1) {
- for(String str:same) {
- if(str.equals(n)) continue;
- if(dest[i]==null||str.compareTo(dest[i])<0) dest[i]=str;
- }
- continue;
- }
- int min=Integer.MAX_VALUE;
- List<String> cities=new ArrayList<>();
- Map.Entry<Integer,List<String>> lowerY=yMap.lowerEntry(p[1]);
- if(lowerY!=null) {
- min=p[1]-lowerY.getKey();
- cities.addAll(lowerY.getValue());
- }
- Map.Entry<Integer,List<String>> higherY=yMap.higherEntry(p[1]);
- if(higherY!=null) {
- if(higherY.getKey()-p[1]<min) {
- min=higherY.getKey()-p[1];
- cities.clear();
- cities.addAll(higherY.getValue());
- } else if(higherY.getKey()-p[1]==min) {
- cities.addAll(higherY.getValue());
- }
- }
- // check the same y
- TreeMap<Integer,List<String>> xMap=yxMap.get(p[1]);
- Map.Entry<Integer,List<String>> lowerX=xMap.lowerEntry(p[0]);
- if(lowerX!=null) {
- if(p[0]- lowerX.getKey()<min) {
- min=p[0]- lowerX.getKey();
- cities.clear();
- cities.addAll(lowerX.getValue());
- } else if(p[0]- lowerX.getKey()==min) {
- cities.addAll(lowerX.getValue());
- }
- }
- Map.Entry<Integer,List<String>> higherX=xMap.higherEntry(p[0]);
- if(higherX!=null) {
- if(higherX.getKey()-p[0]<min) {
- min=higherX.getKey()-p[0];
- cities.clear();
- cities.addAll(higherX.getValue());
- } else if (higherX.getKey()-p[0]==min) {
- cities.addAll(higherX.getValue());
- }
- }
- if(!cities.isEmpty()) {
- dest[i]=cities.get(0);
- for(String city:cities){
- if(dest[i].compareTo(city)>0) dest[i]=city;
- }
- }
- }
- return dest;
- }
复制代码
[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i] |