假设我们有许多餐馆,其中餐馆[i]有[idi,Ratingi,素食主义者,pricei,distancei]。我们必须使用三个过滤器过滤餐馆。
素食主义者过滤器将为true(表示我们应只包括素食主义者设置为true的餐馆)或false(意味着我们可以包括任何餐馆)。
maxPrice过滤器和max distance过滤器是分别应考虑的餐厅价格和距离的最大值。
我们必须在过滤后找到饭店ID的数组,并按从高到低的等级排序。对于具有相同评分的餐厅,请按ID降序排列。为简单起见,纯素食主义者和纯素食主义者在值为true时为1,在值为false时为0。
所以如果输入就像餐馆-
[[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,评分= 4,veganFriendly = 1,价格= 40,距离= 10]
餐厅2 [id = 2,评分= 8,veganFriendly = 0,价格= 50,距离= 5]
餐厅3 [id = 3,评分= 8,veganFriendly = 1,价格= 30,距离= 4]
餐厅4 [id = 4,评分= 10,veganFriendly = 0,价格= 10,距离= 3]
餐厅5 [id = 5,评分= 1,veganFriendly = 1,价格= 15,距离= 1]
在用veganFriendly = 1,maxPrice = 50和maxDistance = 10过滤餐馆后,我们得到了餐馆3,餐馆1和餐馆5(按等级从高到低排序)。
为了解决这个问题,我们将遵循以下步骤-
定义一个名为temp的矩阵,n:=餐厅数组的大小
对于i,范围为0至n – 1
将[r [i,0],r [i,1]]插入temp
如果vf = 0或r [i,2] = vf且r [i,3] <= mp和r [i,4] <= md,则
根据评分,以降序对餐厅进行排序
制作一个称为ret的数组
对于我在0到温度范围内的范围
将temp [i,0]插入ret
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<int> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: static bool cmp(vector <int> a, vector <int> b){ if(b[1] != a[1])return a[1] > b[1]; return a[0] > b[0]; } vector<int>filterRestaurants(vector<vector<int>>& r, int vf, int mp, int md) { vector < vector <int> > temp; int n = r.size(); for(int i = 0; i < n; i++){ if((vf == 0 || r[i][2] == vf) && r[i][3] <= mp && r[i][4] <= md){ temp.push_back({r[i][0], r[i][1]}); } } sort(temp.begin(), temp.end(), cmp); vector <int> ret; for(int i = 0; i < temp.size(); i++)ret.push_back(temp[i][0]); return ret; } }; main(){ vector<vector<int>> v = {{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}}; Solution ob; print_vector(ob.filterRestaurants(v, 1, 50, 10)); }
[[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]] 1 50 10
输出结果
[3,1,5]