美文网首页
(初级)3.合并两个有序数组

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

作者: one_zheng | 来源:发表于2018-07-12 20:32 被阅读4次

    给定两个有序整数数组 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]

    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
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:(初级)3.合并两个有序数组

          本文链接:https://www.haomeiwen.com/subject/ltzrpftx.html