- 問題描述
Leetcoder 1333 餐廳的過濾。
有2個List:id, rating
排序要求:如果rating相等,id較大者優先;否則rating較大的id優先。
- 方法
- step1: 創建一個索引列表0, 1, 2, 3, …
- step2: 對索引列表排序,重寫比較方法:
idx.sort((o1, o2)->ratings.get(o1).equals(ratings.get(o2)) ? ids.get(o2)-ids.get(o1) : ratings.get(o2) - ratings.get(o1));
迷之排序:表面上對有序的索引進行排序,實際上是對id和rating進行排序,因爲排序約束被暗含在了索引中。
- step3: 通過索引列表,獲得目標id序列。
for (Integer i : idx) { ret.add(ids.get(i)); }
- 評測
時間:2020-1-31
- 代碼
class Solution {
public List<Integer> filterRestaurants(int[][] restaurants, int veganFriendly, int maxPrice, int maxDistance) {
List<Integer> ids = new ArrayList<>();
List<Integer> ratings = new ArrayList<>();
for (int i = 0; i < restaurants.length; ++i) {
if (restaurants[i][2] >= veganFriendly && restaurants[i][3] <= maxPrice && restaurants[i][4] <= maxDistance) {
ids.add(restaurants[i][0]);
ratings.add(restaurants[i][1]);
}
}
int n = ids.size();
List<Integer> idx = new ArrayList<>(n);
for (int i = 0; i < n; ++i) {
idx.add(i, i);
}
idx.sort((o1, o2)->ratings.get(o1).equals(ratings.get(o2)) ? ids.get(o2)-ids.get(o1) : ratings.get(o2) - ratings.get(o1));
ratings.clear();
List<Integer> ret = ratings;
for (Integer i : idx) {
ret.add(ids.get(i));
}
return ret;
}
}