按C ++中的素食主义者,价格和距离筛选餐厅
假设我们有许多餐馆,其中餐馆[i]有[idi,Ratingi,素食主义者,pricei,distancei]。我们必须使用三个过滤器过滤餐馆。
素食主义者过滤器将为true(表示我们应只包括素食主义者设置为true的餐馆)或false(意味着我们可以包括任何餐馆)。
maxPrice过滤器和maxdistance过滤器是分别应考虑的餐厅价格和距离的最大值。
我们必须在过滤后找到饭店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
范例(C++)
让我们看下面的实现以更好地理解-
#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]