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]]
以后都不翻译题目了。。大家自己看吧
方法比较简单,实现也不是很难。
从输入中每次都找高度最低的那个,比如例题中就是[4,4],我们需要一个新的vector,于是这个[4,4]就理所应当排在第5个位置,前面有4个人嘛。
然后第二找的就应该是[5,0]或者[5,2]也可以,比如[5,2]的话,那么他就应该放在第3个位置
下一个就是[5,0],放在第1个位置。
下一个[6,1]这个开始有讲究了因为新的vector此时的状态是{[5,0],x,[5,2],x,[4,4],x} 其中x表示尚空的位置,则[6,1]就应该放在第4个位置,他的前面有一个比他高或者相同高度的人,也就是说他的前面应该有一个现存和他一样高或者为空的位置。因为我们是从高度最低开始寻找的,所以空位置将来必然是和他一样高或比他高的,因此可以当做是比他高的存在。
那么下一个[7,1] 此时状态为{[5,0],x,[5,2],[6,1],[4,4],x},很清晰,放在最后
下一个[7,0]状态为{[5,0],x,[5,2],[6,1],[4,4],[7,1]},只剩一个位置了
具体代码如下:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
pair<int, int> p(-1,-1);
int s = people.size();
vector<pair<int, int>> v(s,p);
for(int i = 0; i < s; ++i){
int size = people.size();
int k = 0;
for(int j = 0; j < size; ++j) {
if(people[k].first > people[j].first){
k = j;
}
}
pair<int, int> t = people[k];
people.erase(people.begin() + k);
int count = 0;
for(int j = 0; j < s; ++j){
if(v[j].second == -1 || v[j].first >= t.first){
if(count == t.second){
v[j] = t;
break;
}
else{
count++;
}
}
}
}
return v;
}