「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意描述
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
示例 1:
输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
解释:
编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。
编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。
编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。
编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。
编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。
分析
可能题意容易绕晕一群人,先来讲讲这个题目的意思。
-
[h,k],h是身高大家都能看得懂。但是这个k是什么呢,读了两遍题目,再配合第一个示例,我的理解是 k表示当前队里,在它前面的人大于等于自己的人的个数。比如下面
[7, 0] 前面没有比7大的,所以是0
[6, 1] 前面有一个身高7的,所以是1个
[7, 1] 前面有一个身高7的,所以是1个 即全都符合要求。
题目看懂了,其实没有那么难,代码五分钟,看题两小时~苦涩
解法1:贪心+排序
思路:首先按照个子从低到高进行排序,个子相同的按照另一个参数从大到小排序。然后从后向前遍历排序好的数组,这样确保已经排好队的人都是比当前即将插入队伍这个人的身高要高。再把这个人插入到k索引的对应位置
var reconstructQueue = function(people) {
if (!people || !people.length) return [];
people.sort((a, b) => a[0] === b[0] ? a[1] - b[1] : b[0] - a[0]);
const res = [];
people.forEach(item => {
res.splice(item[1], 0, item); // 插入到k对应的位置
})
return res;
};
题解2:排序+reduce
思路:这个解法在思路上其实没有什么改变,只是代码更简洁了,也让我们意识到,reduce的强大。当然也不能过度去贪恋代码的简短,要真正的懂了才是真的,也不是简短就是好。要做到的应该是短小精悍,不能只短~我没开车
var reconstructQueue = function(people) {
people.sort((a, b) => a[0] === b[0] ? a[1] - b[1] : b[0] - a[0])
return people.reduce((acc, cur) => (acc.splice(cur[1], 0, cur), acc), [])
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤