- 问题描述
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;
}
}