LeetCode:88. 合并两个有序数组

88. 合并两个有序数组

  

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

说明:

初始化 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]

链接:https://leetcode-cn.com/problems/merge-sorted-array

时间复杂度:O(m + n)

空间复杂度:O(1)

思路:

  • 大致思路是,从后往前倒序比较两个数组大小,选取大的填充到nums1的尾部,从后往前可以避免移动数组元素。
  • 如果nums2处理完了,num1剩余元素是不需要处理的,所以遍历的时候只需要遍历nums2,但是比较大小之前要判断num1是否处理完,避免数组越界。

C++版本:

void merge(vector& nums1, int m, vector& nums2, int n) {
    int index = m + n - 1;  // 初始时为有足够空间的nums1末尾下标
    while (n)               // 条件:当nums2中的所有元素都移动至nums1中时,直至0
    {
        if (m == 0)         // 若数组nums1为空时,即:数组nums1没有任何元素存在
        {
            nums1[index--] = nums2[--n];
            // n--;    // 下标从0开始
            // nums1[index] = nums2[n];
        }
        else if (nums1[m - 1] < nums2[n - 1]) // n-1:下标从0开始
        {
            nums1[index--] = nums2[n - 1];
            n--;
        }
        else                // 包含 nums1[i] == nums2[j] 的情况
        {
            nums1[index--] = nums1[m - 1];
            m--;
        }
    }
}

Go版本:

func merge(nums1 []int, m int, nums2 []int, n int)  {
    length := m + n - 1
    m, n = m - 1, n - 1

    for length >= 0 {
        if (m >= 0 && n >= 0) && (nums1[m] > nums2[n]) {
            nums1[length] = nums1[m]
            m--
        } else if (m >= 0 && n >= 0) && (nums1[m] <= nums2[n]) {
            nums1[length] = nums2[n]
            n-- 
        } else if m >= 0 {
            nums1[length] = nums1[m]
            m--
        } else if n >= 0 {
            nums1[length] = nums2[n]
            n-- 
        }
        length--
    }
}

// // nums1和nums2分别从后向前遍历
// func merge(nums1 []int, m int, nums2 []int, n int)  {
//     len := m + n - 1
//     m--
//     n--
//     for m >= 0 && n >=0 {
//         if nums1[m] < nums2[n] {
//             nums1[len] = nums2[n]
//             n--
//             len--
//         } else {
//             nums1[len] = nums1[m]
//             m--
//             len--
//         }
//     } 

//     for m >=0 {
//         nums1[len] = nums1[m]
//         m--
//         len--
//     }

//     for n >= 0 {
//         nums1[len] = nums2[n]
//         n--
//         len--
//     }
// }

LeetCode:88. 合并两个有序数组_第1张图片

你可能感兴趣的:(#,LeetCode,leetcode,算法,java)