leetcode每日一题:406.queue-reconstruction-by-height(根据升高重建队列)

在这里插入图片描述
思路:先对队列进行排序,k小的排前面,如果k相等,那么按照h小的排序;随后进行插入,每次插入元素 i ,检查前面有多少人升高比i的高,并对人数计数,对于相同的k,i应该按从小到大的顺序插入;
在这里插入图片描述

static bool cmp(vector<int> a, vector<int> b)
{
    if (a[1] < b[1])
        return true;
    else if (a[1] == b[1])
    {
        return a[0] < b[0];
    }
    return false;
}

vector<vector<int>> reconstructQueue(vector<vector<int>> &people)
{
    int len = people.size();
    if (len < 2)
        return people;

    //排序
    sort(people.begin(), people.end(), cmp);
    vector<vector<int>> res;
    res.push_back(people[0]);
    //对剩下的元素进行插入
    for (int i = 1; i < len; i++)
    {
        int cur_high = people[i][0], cur_order = people[i][1];
        //如果k与前者相同,那么直接插入,因为k相同我是按升高从小到达排序的;
        //如果身高相同, 并且k=前面的k+1,那么直接插入;
        if (cur_order == res[i - 1][1] || (cur_high == res[i - 1][0] && cur_order == res[i - 1][1] + 1))
            res.push_back(people[i]);
        else
        {
            int count = 0;
            int j = 0;
            for (; j < i; j++)
            {
                if (res[j][0] >= cur_high)
                {
                    count++;
                }
                if (count >= cur_order)
                {
                    if (j + 1 < i && cur_high > res[j+1][0])
                        continue;
                    j += 1;
                    break;
                }
            }

            res.insert(res.begin() + j, people[i]);
        }
    }
    return res;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值