题目链接
406. 根据身高重建队列 - 力扣(LeetCode)
题目描述
people[i]=[hi,ki]
表示打乱顺序的队列中,
第i
个人的身高为hi
,原先队列中排在i
前面的身高大于等于``i
的有ki
个人,
输出还原后的队列
输入输出样例
1 2 3 4 5 6 7 8 9 10
| 输入: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]] 是重新构造后的队列。
|
题目解释
仔细读题发现可以先放置身高比较高的人(这种人影响比较大)
代码
个人实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public: vector<vector<int>> reconstructQueue(vector<vector<int>>& people) { sort(people.begin(), people.end(), [](const vector<int>& a, const vector<int>& b) { return a[0] == b[0] ? a[1] < b[1] : a[0] > b[0]; }); vector<vector<int>> res; for (auto p : people) { res.insert(res.begin() + p[1], p); } return res; } };
|
官方实现
作者:力扣官方题解
链接:https://leetcode.cn/problems/queue-reconstruction-by-height/solutions/486066/gen-ju-shen-gao-zhong-jian-dui-lie-by-leetcode-sol
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public: vector<vector<int>> reconstructQueue(vector<vector<int>>& people) { sort(people.begin(), people.end(), [](const vector<int>& a, const vector<int>& b) { return a[0] == b[0] ? a[1] > b[1] : a[0] < b[0]; });
vector<vector<int>> ans(people.size()); for (auto p : people) { int blank = -1; for (int i = 0; i < people.size(); i++) { if (ans[i].empty()) { blank++; if (blank == p[1]) { ans[i] = p; break; } } } } return ans; } };
|