题目:
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。 注意: 总人数少于1100人。 示例 输入: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 输出: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
这题的关键在于:高个子看不到矮个子。所以先排高个,然后再排矮个子。矮个子的插入不会影响高个子的人数。
第一步 按身高降序,按人数升序。让结果变为:
[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
第二步,遍历数组,根据人数插入到对应的位置。
[[7,0],[7,1]]
[[7,0], [6,1], [7,1]]
[[5,0], [7,0], [6,1], [7,1]]
[[5,0], [7,0], [5,2], [6,1], [7,1]]
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
完整代码:
/** * @param {number[][]} people * @return {number[][]} */ var reconstructQueue = function(people) { var a=[]; people.sort((a,b)=>{ return a[0]==b[0]?a[1]-b[1]:b[0]-a[0]//如果身高相等,按人数升序排列;如果身高不相等,按身高降序排列 }); for(var i of people){ a.splice(i[1],0,i) } return a; };
知识点:
1、sort排序。上面的代码sort排序包括两个知识点,一是多维数组取值可以直接用a[n]的方式。二排序规则可以有多种规则。
第一参数a, 第二参数b ------ a-b升序 b-a降序。
sort排序的基本原理是,利用冒泡和插入的方式,依次比较前面的数和当前数(二分法比较),把当前数插入到前面已排好的序列中。具体可参考。
2、splice。插入/删除 会改变原数组。
第一个参数是索引,要插入或删除的位置
第二个参数是删除的个数,如果是0,则不删除,只插入。
第三/n个参数是插入的值(不必须)。
举例:
var a=[1,2,3,4,5] a.splice(2,1)//[1,2,4,5] a.splice(2,1,6)//[1,2,6,4,5] a.splice(2,0,6)//[1,2,6,3,4,5] a.splice(2,3,6)//[1,2,6]
区别:
slice(start,end) 相当于截取数组,返回新数组。不会改变原数组。