使用 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]

更新於: 2020 年 4 月 29 日

98 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告