代码如下
func reconstructQueue(people [][]int) [][]int {
sort.Slice(people,func(i,j int)bool { //定义排序算法,首先要明确people[i] 是代表people数组里的每个人 ,people[i][0] 代表的是第i个人的身高
if people[i][0] == people[j][0] { //所以这里的意思是如果两个人的身高是相同的
return people[i][1] < people[j][1] //那么就要按照k值从小到大来排
}
return people[i][0] > people[j][0] //如果身高不同按照身高的大小来排
})
res := make([][]int,0) //创建一个二维切片,这里长度必须是0,因为后面需要不断添加元素,如果这里长度不是0会导致后面添加的元素变多
for _,v := range people { //遍历数组
res = append(res,v) //追加元素
copy(res[v[1]+1:],res[v[1]:]) //这里的意思是把元素在v[1]的位置往后移一位,这里的原理是把res切片里v[1]包括v[1]后面所有的元素复制给v[1]+1开始到最后,但是由于长度相差1,所以res元素里最后的元素会在这个过程中消失即刚追加的元素,并且在v[1]这个位置上保留原来v[1]的值
res[v[1]] = v //此时将v[1]重新赋值
注 v[1] 其实就是原数组的k值,而这个k值其实就代表着应该插入的位置,因为已经将身高从小到大排列,所以新插入的比前面元素身高小的元素不会有影响
}
return res
}