LeetCode 406 根据身高重建队列

1、数据结构:没有使用额外的数据空间。

2、昨天第一次接触这道题的时候,直接蒙圈了,整个替换过程有点乱,可能是精准踩到我不会的雷区了,梳理思路重新编写代码就清晰了很多。

首先对people数组按照如下规律进行排序:身高较高的用户排在前面,当身高一致时,位置较前的用户排在前面。

对排序后的数组进行观察可以发现只要从头至尾进行遍历,在这一过程中对比people[i][1](应该在的位置)与i(实际的位置),若 people[i][1]<i,则将people[i]移动到对应位置,其它元素相应地向后移动即可。举例如下 :

但在最初编码的过程中,遇到了不小的问题,因为不想使用额外的空间存储排序后的people,所以在取出,重新插入元素的过程中遇到了不小的问题。最后看题解得出方法,将people[i][1]与i之间的元素依次后移,用people[i-1]覆盖people[i]后,空出 people[i][1] 对应位置,在这里插入people[i]

func reconstructQueue(people [][]int) [][]int {
    sort.Slice(people, func(i, j int) bool {
        a, b := people[i], people[j]
        return a[0]>b[0] || a[0] == b[0] && a[1] < b[1]
    })

    for k, v:=range people{
        pos:=v[1]
        for i:=0; i<k; i++{ // 遍历该点前面的各个点
            if i==pos{ // 找到v应该存放的位置
                tmp:=v  // 暂存v的值
                for j:=k-1; j>=i; j--{ people[j+1]=people[j] } // 前面的各个节点前移
                people[i]=tmp
                break
            }
        }
    }
    return people
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值