根据身高重建队列--力扣

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;
}

结果

在这里插入图片描述


总结

在这里插入图片描述

以上是关于根据身高重建队列--力扣的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 0406. 根据身高重建队列

[LeetCode-Golang] 406. 根据身高重建队列

406. 根据身高重建队列

406. 根据身高重建队列

贪心算法:根据身高重建队列(续集)

Leetcode 406.根据身高重建队列