题目
自解
思路分析
- 有序递增 => 数组合并
- 冒泡排序,左大右小则交换
代码实现
go
func merge(nums1 []int, m int, nums2 []int, n int) {
// nums1 合并 nums2
// for i := 0; i < n; i++ {
// nums1[m+i] = nums2[i]
// }
// 优化1: 使用for range
for i, v := range nums2 {
nums1[m+i] = v
}
// nums内部开始冒泡排序
for i := 0; i < len(nums1); i++ {
for j := 0; j < len(nums1)-i; j++ {
if j+1 == len(nums1) {
break
}
if nums1[j] > nums1[j+1] {
temp := nums1[j]
nums1[j] = nums1[j+1]
nums1[j+1] = temp
fmt.Println(nums1)
} else {
fmt.Println(nums1)
}
}
}
fmt.Println(nums1)
}
他解
思路分析
- 初始化三个指针 p1=m一1指向nums1的未尾,p2=n-1指向nums2的末尾,p=m+n-1指向合并后的数组末尾
- 不断比较nums[p1]和nums[p2]的大小,将较大的值放入nums[p]中
- 当p1或者p2的项放进nums1后。当p2项多于p1项时,还需要将p2剩余的元素放入进去
代码实现
go
func merge(nums1 []int, m int, nums2 []int, n int) {
// 双指针,从后往前合并
p1 := m - 1
p2 := n - 1
p := m + n - 1
for p1 >= 0 && p2 >= 0 {
if nums1[p1] > nums2[p2] {
nums1[p] = nums1[p1]
p1--
} else {
nums1[p] = nums2[p2]
p2--
}
p--
}
// 将剩余的nums2元素复制到nums1中
for p2 >= 0 {
nums1[p] = nums2[p2]
p2--
p--
}
}