leetcode刷题----406.根据身高重建队列

1.题目描述

在这里插入图片描述

2.思路

假设用一个向量存储所有的节点,节点的第一个值表示身高,节点的第二个值表示希望排的次序。
思路如下:先将所有节点排序,先按照身高排序,同样身高的按照次序排序。然后用一个map将各个身高的人数记录下来,要记录各个身高的人数是因为同样身高的人中我们先排次序靠后的人,再排次序考前的人,可能会导致次序考后的人的实际次序与期待次序不符,这时记录的某一身高下的人数就起作用了,只要将该节点插入到放回结果中相对开始位置为number[height]-1处即可,相当于先将它往前移动了n位,当他对应的身高的节点全部插入时,他又往后移动了n位,使得实际位置与期望位置对应。先放身高高的节点,再放身高矮的节点。
附上代码:

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

void show(vector<pair<int, int>>& people){
    for(auto item:people){
        cout<<item.first<<"  "<<item.second<<endl;
    }
}
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
    map<int,int> number;
    sort(people.begin(),people.end());
    //show(people);
    for(auto iter=people.begin();iter!=people.end();iter++){
        number[iter->first]++;
    }
    vector<pair<int,int>> ret;
    while(!people.empty()){
        pair<int,int> cur=people.back();
        people.pop_back();
        if(ret.empty()) {
            ret.push_back(cur);
            number[cur.first]--;
            continue;
        }
        if(number[cur.first]==1)
            ret.insert(ret.begin()+cur.second,cur);
        if(number[cur.first]>1)
            ret.insert(ret.begin()+cur.second-number[cur.first]+1,cur);
        number[cur.first]--;
    }
    show(ret);
    return ret;
}

int main(){
    cout<<"请输入键值对的数目:";
    int number;
    cin>>number;
    vector<pair<int,int>> test;
    for(int i=0;i<number;i++){
        int a,b;
        cin>>a>>b;
        pair<int,int> temp(a,b);
        test.push_back(temp);
    }
    reconstructQueue(test);
    return 0;
}

3.运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yn359992335/article/details/89332248