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
}