(初级)3.合并两个有序数组

2018-07-12  本文已影响4人  one_zheng

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]

package sort

// 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

// 说明:

// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
// 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
// 示例:

// 输入:
// nums1 = [1,2,3,0,0,0], m = 3
// nums2 = [2,5,6],       n = 3

// 输出: [1,2,2,3,5,6]
func merge(nums1 []int, m int, nums2 []int, n int) {
    if n == 0 {
        return
    }
    if m == 0 && n != 0 {
        for i := 0; i < n; i++ {
            nums1[i] = nums2[i]
        }
        return
    }

    for i := 0; i < n; i++ {
        for j := 0; j < m; j++ {
            if nums2[i] >= nums1[j] {
            } else {
                for z := m; z > j; z-- {
                    nums1[z] = nums1[z-1]
                }
                nums1[j] = nums2[i]
                m = m + 1
                break
            }
        }
        if nums2[i] >= nums1[m-1] {
            nums1[m] = nums2[i]
            m = m + 1
        }
    }
}

末尾填充法
复杂度
O(M+N) 时间 O(1) 空间

思路
从后往前填充即可

注意
先当两个数组都有元素的时候填充大的到末尾,如果有一个数组的数用完了,说明剩下的那个数组的所有数都小于当前填充的位置:

如果是第一个数组用完了,说明剩下的(最小的那些)全是数组2,把数组2填充进去就好了

如果是第二个数组用完了,说明剩下的全是数组1,不用填充了,他们已经在了

代码

func merge(nums1 []int, m int, nums2 []int, n int) {
    i := m - 1
    j := n - 1
    writeIdx := m + n - 1
    for {
        if i >= 0 && j >= 0 {
            if nums1[i] > nums2[j] {
                nums1[writeIdx] = nums1[i]
                i--
            } else {
                nums1[writeIdx] = nums2[j]
                j--
            }
            writeIdx = writeIdx - 1
        } else {
            break
        }
    }
    for {
        if j >= 0 {
            nums1[writeIdx] = nums2[j]
            j--
            writeIdx = writeIdx - 1
        } else {
            break
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读