1. 程式人生 > 其它 >406根據身高重建佇列(插入排序)

406根據身高重建佇列(插入排序)

技術標籤:LeetCodeleetcode演算法

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 的人。

編號為 4 的人身高為 4 ,有 4 個身高更高或者相同的人排在他前面,即編號為 0、1、2、3 的人。
編號為 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;
}