https://leetcode.com/problems/relative-sort-array/
題意
給出一個 arr2 數組,裡面每個 int 不會有重複;給出另一個 arr1 數組,要對 arr1 數組排序,使其滿足以下規則:
class Solution {public: int vis[1010]; vector<int> relativeSortArray( vector<int>& arr1, vector<int>& arr2) { memset(vis, -1, sizeof vis); for (int i = 0; i < arr2.size(); ++i) vis[arr2[i]] = i;
auto cmp = [this](const int x, const int y) { if (vis[x] == -1 && vis[y] == -1) { return x < y; }
if (vis[x] == -1) return false; if (vis[y] == -1) return true;
return vis[x] < vis[y]; };
sort(arr1.begin(), arr1.end(), cmp);
return arr1; }};本題很多做法,我們說一個實現和理解起來都比較容易的。
實現排序的 compare 函數
注意到一點,arr2 裡面的元素都不會有重複,因此我們可以記錄下每個元素所處的位置,例如 arr2 = {2,1,4,3,9,6},可以得到如下位置記錄
pos[2] = 0
pos[1] = 1
pos[4] = 2
pos[3] = 3
pos[9] = 4
pos[6] = 5
當我們對 arr1 進行排序的時候,需要對比 a,b 兩個數字,使用以下規則:
若 a,b 兩個數字都在 arr2 中出現過,則查看 pos 數組,對比 pos[a] 和 pos[b],從而知道 a,b 哪個排前面
若 a,b 只有一個出現在 arr2,則出現過的排前面,沒出現過的排後面
若 a,b 都不在 arr2 中出現過,則直接比較它們的值,決定誰排在前面
PapaMelon, 讓算法好玩
關注 B 站 不愛睡覺的大豬
獲取更好的視頻體驗