使用 C++ 篩選餐廳(根據素食友好、價格和距離)
假設我們有一個餐廳陣列,其中 restaurants[i] 包含 [idi, ratingi, vegan friendly, pricei, distancei]。我們需要使用三個過濾器來篩選這些餐廳。
素食友好過濾器將為真(表示我們應該只包含素食友好設定為真的餐廳)或假(表示我們可以包含任何餐廳)。
maxPrice 過濾器和 maxDistance 過濾器分別表示我們應該考慮的餐廳價格和距離的最大值。
我們需要找到篩選後的餐廳 ID 陣列,並按評分從高到低排序。對於評分相同的餐廳,按 ID 從高到低排序。為簡單起見,素食友好和 vegan-friendly 在為真時取值為 1,為假時取值為 0。
因此,如果輸入類似於 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, 評分=4, 素食友好=1, 價格=40, 距離=10]
餐廳 2 [id=2, 評分=8, 素食友好=0, 價格=50, 距離=5]
餐廳 3 [id=3, 評分=8, 素食友好=1, 價格=30, 距離=4]
餐廳 4 [id=4, 評分=10, 素食友好=0, 價格=10, 距離=3]
餐廳 5 [id=5, 評分=1, 素食友好=1, 價格=15, 距離=1]
篩選後,符合 veganFriendly = 1、maxPrice = 50 和 maxDistance = 10 的餐廳有餐廳 3、餐廳 1 和餐廳 5(按評分降序排列)。
為了解決這個問題,我們將遵循以下步驟:
定義一個名為 temp 的矩陣,n := 餐廳陣列的大小
對於 i 從 0 到 n – 1 的範圍
如果 vf = 0 或 r[i, 2] = vf 且 r[i, 3] <= mp 且 r[i, 4] <= md,則
將 [r[i, 0], r[i, 1]] 插入 temp
根據評分對餐廳進行降序排序
建立一個名為 ret 的陣列
對於 i 從 0 到 temp 大小的範圍
將 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]