概述
给出了两个数组。这两个数组都是经过排序的
-
第一个数组的长度为m+n
-
第二个数组的长度为n
我们的目标是合并这些排序的数组。第一个数组包含足够的长度,所以第一个数组应该只被修改。
Input1: [2,3,4,0,0]
Input2: [1,5]
Output: [1, 2, 3, 4, 5]
Input1: [4,5,0,0,0,0]
Input2: [1, 2, 3, 7]
Output: [1, 2, 3, 4, 5, 7]
以下是我们可以采取的方法
- 将第一个数组中的所有元素按排序顺序移到最后。第一个数组将成为
[0,0,2,3,4]
-
现在从第一个数组的第m个索引元素和第二个数组的第0个索引开始。
-
比较两者,将较小的放在第一个数组中的第0个索引处。第一个数组将成为
[1, 0, 2, 3, 4]
- 重复这个过程。由于我们有足够的空间,第一个数组末尾的值将在被覆盖之前被放在前面。
程序
下面是同样的程序。
package main
import "fmt"
func merge(nums1 []int, m int, nums2 []int, n int) []int {
if m == 0 {
for k := 0; k < n; k++ {
nums1[k] = nums2[k]
}
return nums1
}
nums1 = moveToEnd(nums1, m)
i := n
j := 0
for k := 0; k < m+n; k++ {
if i < m+n && j < n {
if nums1[i] < nums2[j] {
nums1[k] = nums1[i]
i++
} else {
nums1[k] = nums2[j]
j++
}
} else if j < n {
nums1[k] = nums2[j]
j++
}
}
return nums1
}
func moveToEnd(nums []int, m int) []int {
lenNums := len(nums)
k := lenNums
for i := m - 1; i >= 0; i-- {
nums[k-1] = nums[i]
k--
}
return nums
}
func main() {
output := merge([]int{2, 3, 4, 0, 0}, 3, []int{1, 5}, 2)
fmt.Println(output)
output = merge([]int{4, 5, 0, 0, 0, 0}, 2, []int{1, 2, 3, 7}, 4)
fmt.Println(output)
}
输出
[1 2 3 4 5]
[1 2 3 4 5 7]