首页 > 学院 > 开发设计 > 正文

LeetCode OJ 406. Queue Reconstruction by Height

2019-11-06 06:03:40
字体:
来源:转载
供稿:网友

LeetCode OJ 406. Queue Reconstruction by Height


Description

Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k), where h is the height of the person and k is the number of people in front of this person who have a height greater than or equal to h. Write an algorithm to reconstruct the queue.

Note: The number of people is less than 1,100.

Example

Input: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

Output: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

解题思路

这个题目的解题方法一开始比较难想到。但是有了想法做起来就很简单。 队列中的元素(h,k)表示在这个元素前比h大的元素有k个。题意是要把这样的元素组成的队列排序。首先把元素排序:按照h的降序排列,h相等时,按照k的升序排列。然后我们再一个个把元素插入到结果队列中。插入的方法是:插入到当前队列下标为k的位置。因为我们之前插入的都是比这个元素的h值大的元素,因此当前元素的h值就是队列中所剩下未插入结果队列的h值最大的元素了。而且k值是升序排列的,保证了结果插入的过程中不会越界。 eg. 题目中所给的输入进行排序后 Input: [[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]] 结果Result首先插入第一个元素[7,0]: Result: [[7,0]] 插入第二个元素[7,1],在Result中下标为1的位置,即偏移量为1: Result: [[7,0], [7,1]] 插入第三个元素[6,1]: Result: [[7,0], [6,1], [7,1]] 插入第四个元素[5,0]: Result: [[5,0], [7,0], [6,1], [7,1]] 插入第五个元素[5,2]: Result: [[5,0], [7,0], [5,2], [6,1], [7,1]] 插入第六个元素[4,4]: Result: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

Note:

std::sort函数是全局的,如果第三个参数cmp不是静态成员函数或者全局函数,运行都会报错。非静态函数是依赖于具体对象的,因此调用sort函数时,只能调用不依赖于对象的静态函数cmp。

代码

个人github代码链接

class Solution {public: static bool cmp(pair<int, int> p1, pair<int, int> p2){ return (p1.first > p2.first) || ((p1.first == p2.first) && (p1.second < p2.second)); } vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) { vector<pair<int, int>> ans; sort(people.begin(), people.end(), cmp); for(auto p:people){ ans.insert(ans.begin() + p.second, p); } return ans; }};
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表