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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值