题目:
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为排在这个人之前高度比他高或和他一样高的人的数量。写下一个算法来重构这个队列。
注意:
人的数量少于1,100。
例子
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
思路:
首先将这个数组排序:按数字对中的第一个数字从大到小排序,若两个数字相等,再按后面的数字从小到大排序。排序好后再依次按后面的数字将数字对插入到对应的位置。
C++代码(Visual Studio 2017):
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
bool cmp(const pair<int, int> a, const pair<int, int> b) {
return a.first == b.first ? a.second<b.second : a.first>b.first;
}*/
class Solution {
public:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
if (people.size() == 0) return {};
//sort(people.begin(), people.end(), cmp); //若在外部定义cmp,则需要写到class外面,若写在class里面,编译不通过
sort(people.begin(), people.end(), [](const pair<int, int> &a, const pair<int, int> &b) { //上述sort的另一写法
return a.first == b.first ? a.second<b.second : a.first>b.first;});
vector<pair<int, int>> ans;
for (auto val : people)
ans.insert(ans.begin() + val.second, val);
return ans;
}
};
int main()
{
Solution s;
vector<pair<int, int>> people = { {7,0},{4,4},{7,1},{5,0},{6,1},{5,2} };
vector<pair<int, int>> res = s.reconstructQueue(people);
for (auto m : res) {
cout << m.first << "***" << m.second << " ";
}
return 0;
}