根据身高重建队列--力扣
Posted 穿迷彩服的鲨鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据身高重建队列--力扣相关的知识,希望对你有一定的参考价值。
前言
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
一、示例
示例 1:
输入: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]]
示例 2:
输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]
二、代码解析
1.从高到低+从低到高
代码如下(示例):
//第一维从大到小,第一维相同时,第二维从小到大。
static bool cmp(const vector<int>& a, const vector<int>& b)
{
if (a[0] != b[0])
{
return a[0] > b[0];
}
return a[1] < b[1];
}
/*
* 我们首先对数对进行排序,按照数对的元素 1 降序排序,按照数对的元素 2 升序排序。
* 原因是,按照元素 1 进行降序排序,对于每个元素,在其之前的元素的个数,就是大于等于他的元素的数量,
* 而按照第二个元素正向排序,我们希望 k 大的尽量在后面,减少插入操作的次数。
*/
vector<vector<int>> reconstructQueue(vector<vector<int>>& people)
{
vector<vector<int>> ans;
sort(people.begin(), people.end(), cmp);
//插入操作
for (auto i : people)
{
if (ans.size() <= i[1])
{
ans.emplace_back(i);
}
else
{
ans.insert(ans.begin() + i[1], i);
}
}
return ans;
}
结果
2.优化一下
代码如下(示例):
/*
* 我们首先对数对进行排序,按照数对的元素 1 降序排序,按照数对的元素 2 升序排序。
* 原因是,按照元素 1 进行降序排序,对于每个元素,在其之前的元素的个数,就是大于等于他的元素的数量,
* 而按照第二个元素正向排序,我们希望 k 大的尽量在后面,减少插入操作的次数。
*/
vector<vector<int>> reconstructQueue(vector<vector<int>>& people)
{
vector<vector<int>> ans;
//第一维从大到小,第一维相同时,第二维从小到大。
sort(people.begin(), people.end(), [](const vector<int>& a, const vector<int>& b)
{
if (a[0] != b[0])
{
return a[0] > b[0];
}
return a[1] < b[1];
});
//插入操作
for (auto i : people)
{
if (ans.size() <= i[1])
{
ans.emplace_back(i);
}
else
{
ans.insert(ans.begin() + i[1], i);
}
}
return ans;
}
结果
测试
代码如下(示例):
#include<vector>
#include<algorithm>
#include <iostream>
using namespace std;
//第一维从大到小,第一维相同时,第二维从小到大。
//static bool cmp(const vector<int>& a, const vector<int>& b)
//{
// if (a[0] != b[0])
// {
// return a[0] > b[0];
// }
// return a[1] < b[1];
//}
/*
* 我们首先对数对进行排序,按照数对的元素 1 降序排序,按照数对的元素 2 升序排序。
* 原因是,按照元素 1 进行降序排序,对于每个元素,在其之前的元素的个数,就是大于等于他的元素的数量,
* 而按照第二个元素正向排序,我们希望 k 大的尽量在后面,减少插入操作的次数。
*/
vector<vector<int>> reconstructQueue(vector<vector<int>>& people)
{
vector<vector<int>> ans;
//第一维从大到小,第一维相同时,第二维从小到大。
sort(people.begin(), people.end(), [](const vector<int>& a, const vector<int>& b)
{
if (a[0] != b[0])
{
return a[0] > b[0];
}
return a[1] < b[1];
});
//法一
//sort(people.begin(), people.end(), cmp);
//插入操作
for (auto i : people)
{
if (ans.size() <= i[1])
{
ans.emplace_back(i);
}
else
{
ans.insert(ans.begin() + i[1], i);
}
}
return ans;
}
int main()
{
vector<vector<int>> people = { {7, 0},{4, 4},{7, 1},{5, 0},{6, 1},{5, 2} };
vector<vector<int>> newPeople = reconstructQueue(people);
for (int i = 0; i < newPeople.size(); i++)
{
for (int j = 0; j < newPeople[i].size(); j++)
{
cout << newPeople[i][j] << " ";
}
cout << endl;
}
return 0;
}
结果
总结
以上是关于根据身高重建队列--力扣的主要内容,如果未能解决你的问题,请参考以下文章