• LeetCode # 1333. 餐厅过滤器


    1333. 餐厅过滤器

    题目

    给你一个餐馆信息数组 restaurants,其中 restaurants[i] = [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。

    其中素食者友好过滤器 veganFriendly 的值可以为 true 或者 false,如果为 true 就意味着你应该只包括 veganFriendlyi 为 true 的餐馆,为 false 则意味着可以包括任何餐馆。此外,我们还有最大价格 maxPrice 和最大距离 maxDistance 两个过滤器,它们分别考虑餐厅的价格因素和距离因素的最大值

    过滤后返回餐馆的 id,按照 rating 从高到低排序。如果 rating 相同,那么按 id 从高到低排序。简单起见, veganFriendlyi 和 veganFriendly 为 true 时取值为 1,为 false 时,取值为 0 。

    示例 1:

    输入:restaurants = [[1,4,1,40,10],[2,8,0,50,5],[3,8,1,30,4],[4,10,0,10,3],[5,1,1,15,1]], veganFriendly = 1, maxPrice = 50, maxDistance = 10
    输出:[3,1,5]
    解释:
    这些餐馆为:
    餐馆 1 [id=1, rating=4, veganFriendly=1, price=40, distance=10]
    餐馆 2 [id=2, rating=8, veganFriendly=0, price=50, distance=5]
    餐馆 3 [id=3, rating=8, veganFriendly=1, price=30, distance=4]
    餐馆 4 [id=4, rating=10, veganFriendly=0, price=10, distance=3]
    餐馆 5 [id=5, rating=1, veganFriendly=1, price=15, distance=1]
    在按照 veganFriendly = 1, maxPrice = 50 和 maxDistance = 10 进行过滤后,我们得到了餐馆 3, 餐馆 1 和 餐馆 5(按评分从高到低排序)。

    示例 2:

    输入:restaurants = [[1,4,1,40,10],[2,8,0,50,5],[3,8,1,30,4],[4,10,0,10,3],[5,1,1,15,1]], veganFriendly = 0, maxPrice = 50, maxDistance = 10
    输出:[4,3,2,1,5]
    解释:餐馆与示例 1 相同,但在 veganFriendly = 0 的过滤条件下,应该考虑所有餐馆。

    示例 3:

    输入:restaurants = [[1,4,1,40,10],[2,8,0,50,5],[3,8,1,30,4],[4,10,0,10,3],[5,1,1,15,1]], veganFriendly = 0, maxPrice = 30, maxDistance = 3
    输出:[4,5]

    分析

    三个条件,素食、价格、距离,满足三个条件之后按照两个属性进行排序

    注意判断“素食”的条件,不是互斥条件

    • 素食
    • 非素食

    而是

    • 素食
    • 全食(素食+非素食)

    判断语句可以用restaurant[2] >= veganFriendly

    题解

    class Solution {
        public List<Integer> filterRestaurants(int[][] restaurants, int veganFriendly, int maxPrice, int maxDistance) {
            // 遍历?排序?筛选?
    
            // 保存符合的餐厅
            List<int[]> array = new ArrayList<>();
            // 保存排序后的餐厅id
            List<Integer> res = new ArrayList<>();
    
            //三个条件,素食、价格、距离,满足三个条件之后按照两个属性进行排序
            // 注意满足素食的条件,请求的veganFriendly和数组中的veganFriendlyi,不是互斥条件,素食只包含素食,非素食包含素食和全食
            // 分为两种条件:素食、全食(素食+非素食)
            // 如果是素食为(1)就只匹配(1),如果素食为(0)则匹配(0,1),判断条件restaurant[2] >= veganFriendly
            for(int[] arr : restaurants){
                if(arr[2] >= veganFriendly && arr[3] <= maxPrice && arr[4] <= maxDistance){
                    array.add(arr);
                }
            }
    
            // 排序,优先rating,然后id,List可以用定制排序
            Collections.sort(array, (a, b) -> {
                if(a[1] != b[1]){
                    return b[1] - a[1];
                }else{
                    return b[0] - a[0];
                }
            });
    
            for(int[] v : array){
                res.add(v[0]);
            }
    
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    【算法题】136 137 只出现一次的数,及其变种
    Loading and Unloading Modules
    【AGC】远程配置如何传入自定义属性
    八、MFC对话框
    【数字IC验证快速入门】3、数字IC设计全流程介绍
    JavaScript | 详解变量作用域
    并查集的实现的应用
    【组件】Vue组件之间的通信父传子 | 子传父
    [javaee基础] 常见的javaweb笔试选择题含答案
    【R语言实战】——金融时序ARIMA建模
  • 原文地址:https://blog.csdn.net/hey_wei_ran/article/details/136453291