406.根据身高重建队列
406.根据身高重建队列
题解
题目:给定一个打算的<身高,前面有k个人身高大于等于自己>的数组,返回一个按照<身高,前面有k个人身高大于等于自己>要求排列的数组
思路:
1.一般这种数对的数组,都是按照第一个排序,第二个反着排序 2.这里看到要求是,前面有k个身高大于等于自己的人 3.那么先对身高进行降序,对k进行升序 因为 “有k个身高大于等于自己的人”这个条件,那么必定对于每个人来说 前面的人身高都比自己高,对k升序,是因为希望身高相等的人,k大的排在后面,这样比较容易满足条件 4.遍历这个排序后的数组,将idx=k,接下来分析位置 如果是第一个人,身高必定是最高,他的k必定是0,因为没有比他身高还高的 那么把他插入到ans[idx]的地方 如果不是第一个人,他需要被安排在第idx个位置,这样他前面就有idx个人,就满足k个人比他高了 但是我们插入数组都是一个一个插的,刚开始是没有位置的,所以需要append 将当前数组分为 ans[:idx]和ans[idx:],将当前插入两个中间 变成ans=ans[:idx] + curPersion + ans[idx:] 5.那么会不会影响ans[:idx],ans[idx:]这些人呢? 对于ans[:idx]来说,cur比他们都矮,没影响 对于ans[idx:]来说,cur在他们后面插入,所以ans[idx:]都是比cur高的 矮的人排高的人前面,不影响k,所以没影响
代码
func reconstructQueue(people [][]int) [][]int { sort.Slice(people, func(i, j int) bool { return people[i][0] > people[j][0] || people[i][0] == people[j][0] && people[i][1] < people[j][1] }) ans := make([][]int, 0) for _, v := range people { idx := v[1] ans = append(ans[:idx], append([][]int{v}, ans[idx:]...)...) } return ans }