406 Queue Reconstruction by Height

1 题目

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]]

2 尝试解

2.1 分析

对于一列身高不同的人[5,7,2,6,4,7],分别记录其前面不矮于他的人的个数,即[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]。现在把这个数组打乱,即给定一个数组[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]],还原回人群的排队顺序。

首先个子唯一最矮的人是不会影响其他人的计数的,比如[4,4]去掉后,其他人的计数不发生变化。但是据此可以确定[4,4]的位置就是[4],因为其他人都比他高,他前面刚好有4个人,所以result[4] = [4,4]。这时候剩下的位置是[0,1,2,3,5,6]。

再考虑剩下的个子最矮的人,即[5,0]和[5,2]。在个子最矮的人不唯一时,去掉最后的人,不影响其他人的计数。即去掉[5,2](和[4,4])后,其他人的计数不发生变化。但可以确定[5,2]在剩余的空位中排第3,因为其他的人都不矮于他,所以他前面有且只能有2个人,所以result[2]=[5,2]。同理result[0]=[5,0]。

即将人群按照高度由小到大排序,高度相同的,计数大的即排名靠后的视为更小的。然后根据他们的计数找到在剩余位置中的相对位置。

2.2 代码

class Solution {
public:
    static bool cmp(const vector<int>&a, const vector<int>&b){
        return (a[0] < b[0]) || (a[0]==b[0]&&a[1] > b[1]);
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        vector<vector<int>> result(people.size());
        sort(people.begin(),people.end(),cmp);
        vector<int> pos;
        for(int i = 0; i < people.size(); i++) pos.push_back(i);
        for(auto person : people){
            result[pos[person[1]]] = person;
            pos.erase(pos.begin()+person[1]);
        }
        return result;
    }
};

3 标准解

vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
    auto comp = [](const pair<int, int>& p1, const pair<int, int>& p2)
                    { return p1.first > p2.first || (p1.first == p2.first && p1.second < p2.second); };
    sort(people.begin(), people.end(), comp);
    vector<pair<int, int>> res;
    for (auto& p : people) 
        res.insert(res.begin() + p.second, p);
    return res;
}

 

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值