Every day a Leetcode
题目来源:406. 根据身高重建队列
解法1:贪心
题解:根据身高重建队列
我们先按照身高从大到小排序(身高相同的情况下K小的在前面),这样的话,无论哪个人的身高都小于等于他前面人的身高。所以接下来只要按照K值将他插入相应的位置就可以了。
例如:
示例1排完序:[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]
新建一个二维vector:
[7,0]插入第0的位置
[7,1]插入第1的位置
[6,1]插入第1的位置,这时[7,1]就往后移一位了
…
代码:
/*
* @lc app=leetcode.cn id=406 lang=cpp
*
* [406] 根据身高重建队列
*/
// @lc code=start
class Solution
{
private:
static bool cmp(vector<int> &a, vector<int> &b)
{
if (a[0] == b[0])
return a[1] < b[1];
return a[0] > b[0];
}
public:
vector<vector<int>> reconstructQueue(vector<vector<int>> &people)
{
int n = people.size();
sort(people.begin(), people.end(), cmp);
vector<vector<int>> queue;
for (const vector<int> &person : people)
{
int pos = person[1];
queue.insert(queue.begin() + pos, person);
}
return queue;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n2),其中 n 是数组 people 的长度。我们需要 O(nlogn) 的时间进行排序,随后需要 O(n2) 的时间遍历每一个人并将他们放入队列中。由于前者在渐近意义下小于后者,因此总时间复杂度为 O(n2)。
空间复杂度: O(logn),其中 n 是数组 people 的长度。排序需要 O(logn) 的栈空间。