1333. Filter Restaurants by Vegan-Friendly, Price and Distance
這道題做的過程中,由於語法不熟悉,花費了大量時間,需要掌握comparator自定義寫法。
本題可以
1.用HashMap來存過濾后的數據,然后用自定義的比較器,在list中對符合要求的數據排序。
2.用PriorityQueue,自定義優先隊列的排序方式,將篩選后的數據存入優先隊列,即可自動有序。
class Solution { public List<Integer> filterRestaurants(int[][] restaurants, int veganFriendly, int maxPrice, int maxDistance) { Map<Integer, int[]> map = new HashMap<>(); List<Integer> IDs = new ArrayList<>(); for(int[] id : restaurants){ if(id[2] >= veganFriendly && id[3] <= maxPrice && id[4] <= maxDistance){ map.put(id[0], id); IDs.add(id[0]); } } //第一種寫法 /* Collections.sort(IDs, (id1, id2) -> { int rating1 = map.get(id1)[1]; int rating2 = map.get(id2)[1]; if(rating1 == rating2) return id2-id1; return rating2-rating1; }); */ //第二種寫法 IDs.sort(new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2){ int rating1 = map.get(o1)[1]; int rating2 = map.get(o2)[1]; if(rating1 == rating2) return o2-o1; return rating2-rating1; } }); return IDs; } }
class Solution { public List<Integer> filterRestaurants(int[][] restaurants, int veganFriendly, int maxPrice, int maxDistance) { //PriorityQueue<int[]> pq = new PriorityQueue<>((a,b) -> b[1] == a[1]? b[0] - a[0]: b[1]-a[1]) PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>(){ @Override public int compare(int[] o1, int[] o2){ if(o1[1] == o2[1]) return o2[0]-o1[0]; return o2[1]-o1[1]; } }); List<Integer> res = new ArrayList<>(); for(int[] id : restaurants){ if(id[2] >= veganFriendly && id[3] <= maxPrice && id[4] <= maxDistance) pq.add(id); } while(!pq.isEmpty()) res.add(pq.remove()[0]); return res; } }