406根據身高重建佇列(插入排序)
阿新 • • 發佈:2021-01-07
1、題目描述
假設有打亂順序的一群人站成一個佇列,陣列 people 表示佇列中一些人的屬性(不一定按順序)。每個 people[i] = [hi, ki] 表示第 i 個人的身高為 hi ,前面 正好 有 ki 個身高大於或等於 hi 的人。
請你重新構造並返回輸入陣列people 所表示的佇列。返回的佇列應該格式化為陣列 queue ,其中 queue[j] = [hj, kj] 是佇列中第 j 個人的屬性(queue[0] 是排在佇列前面的人)。
提示:
- 1 <= people.length <= 2000
- 0 <= hi <= 106
- 0 <= ki < people.length
- 題目資料確保佇列可以被重建
2、示例
輸入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
輸出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
解釋:
編號為 0 的人身高為 5 ,沒有身高更高或者相同的人排在他前面。
編號為 1 的人身高為 7 ,沒有身高更高或者相同的人排在他前面。
編號為 2 的人身高為 5 ,有 2 個身高更高或者相同的人排在他前面,即編號為 0 和 1 的人。
編號為 3 的人身高為 6 ,有 1 個身高更高或者相同的人排在他前面,即編號為 1 的人。
編號為 5 的人身高為 7 ,有 1 個身高更高或者相同的人排在他前面,即編號為 1 的人。
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新構造後的佇列。
3、題解
基本思想:插入排序,對people進行排序,按照身高從小到大排序,身高相等的時候按照屬性從大到小排序。然後遍歷每一個people,將當前people往後移屬性位就是其正確位置。(ps:sort中的比較函式必須宣告為類外部(全域性區域)或宣告為靜態函式)
#include<iostream> #include<vector> #include<algorithm> #include<map> #include<set> #include<stack> using namespace std; class Solution { public: vector<vector<int>> reconstructQueue(vector<vector<int>>& people) { vector<vector<int>> res(people); sort(res.begin(),res.end()); int n=res.size(),i,j; for(i=n-2;i>=0;i--) { int k=res[i][1]; for(j=i-1;j>=0;j--) { if(res[j][0]>=res[i][0]) k--; } vector<int> temp(res[i]); for(j=i;j<n-1&&k>0;j++,k--) res[j]=res[j+1]; res[j]=temp; } return res; } }; bool cmpsort(const vector<int>& a,const vector<int>& b){ if(a[0] == b[0]) return a[1]>b[1]; return a[0]<b[0]; } class Solution1 { public: vector<vector<int>> reconstructQueue(vector<vector<int>>& people) { //基本思想:插入排序,對people進行排序,按照身高從小到大排序,身高相等的時候按照屬性從大到小排序 //然後遍歷每一個people,將當前people往後移屬性位就是其正確位置 vector<vector<int>> res(people); sort(res.begin(),res.end(),cmpsort); int n=res.size(),i,j; for(i=n-2;i>=0;i--) { int k=res[i][1]; vector<int> cur(res[i]); for(j=i;j<n-1&&k>0;j++,k--) res[j]=res[j+1]; res[j]=cur; } return res; } }; int main() { Solution1 solute; vector<vector<int>> people={{7,0},{4,4},{7,1},{5,0},{6,2},{5,2}}; vector<vector<int>> res=solute.reconstructQueue(people); for(int i=0;i<res.size();i++) cout<<res[i][0]<<","<<res[i][1]<<endl; return 0; }