Queue Reconstruction by Height(根据高度重组队列)

来源:互联网 发布:上海嘉桥数据咨询公司 编辑:程序博客网 时间:2024/05/17 07:47

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