406. Queue Reconstruction by Height

你快乐吗

Posted by bbkgl on December 28, 2019

梨花院落溶溶月

柳絮池塘淡淡风

C++,排序模拟题,贪心思想。

要解这道题,首先明白一个事,就是对于该序列,身高最低的人在剩余空位中的位置是可以直接确定的

比如序列:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]],元素[4,4]在新序列的是可以直接确定的,因为它就是身高最矮的,就是新序列中的4号位;同理[5,2]也是能确定的,是在2号位,[5,0]是在0号位;而[6,1]是在剩余空位中的1号位,也就是3号位。

所以我们要做的,就是不断找到这个身高最低的人,然后确定在剩余空位中的位置再进行插入,所以是两个步骤。

  • 排序,按照身高从低到高,身高相同,则按照位置从大到小
  • 在剩余序列中插入到对应的位置

以上述思路为基础,写出代码:

class Solution {
public:
    static bool cmp(vector<int> &a, vector<int> &b) {
        if (a[0] == b[0])
            return a[1] > b[1];
        else
            return a[0] < b[0];
    }

    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), cmp);
        vector<int> init = {-1, 0};
        vector<vector<int>> ans(people.size(), init);
        for (const auto &it : people) {
            vector<int> tit = it;
            for (int i = 0; i < ans.size(); i++) {
                if (ans[i] == init && tit[1]-- == 0) 
                    ans[i] = it;
            }
        }
        return ans;
    }
};