基於List對其他List排序的Java實現——明修棧道,暗度陳倉

  • 問題描述
    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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章