力扣算法:合并两个有序数组

力扣算法:合并两个有序数组

  • 一、合并两个有序数组
    • 1、问题
    • 2、提示
    • 3、思路
    • 4、代码
    • 5、时间与空间复杂度
  • 备注

一、合并两个有序数组

1、问题

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

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例1:

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

示例2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]

2、提示

  1. nums1.length == m + n
  2. nums2.length == n
  3. 0 <= m, n <= 200
  4. 1 <= m + n <= 200
  5. -109 <= nums1[i], nums2[i] <= 109

3、思路

题目包含的信息与要求如下:

  1. nums1、nums2两数组均有序。
  2. nums1中“总元素数量”为m+n,“已初始化元素数量”为m。
  3. nums2中“总元素数量”为n,“已初始化元素数量”为n。
  4. 要求修改nums1,不要返回任何内容。

我们分别设置以下标签:
l_m指向nums1已初始化的元素(m个)
l_n指向nums2已初始化的元素(n个)
l_1指向nums1所有元素(m+n个)

l_m、l_n均大于0时,”以从后向前的顺序遍历对比nums1与nums2的已初始化元素,哪个大就放l-1对应的位置上(从后向前的顺序放置),每次对比放置完成后,对应标签数字“-1”,直至l_m或l_n其中一个“不大于等于零”。

如果l_m不大于等于零, l_n大于等于零,则继续遍历对比,直至l_n不大于等于零。

如果l_m大于等于零, l_n不大于等于零,则不需遍历对比,因为是对nums1进行修改,数组本身就是排好序的。

4、代码

from typing import List
class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        l_m,l_n,l_1 = m-1,n-1,len(nums1)-1
        while l_m >= 0 and l_n >= 0:
            if nums1[l_m] >= nums2[l_n]:
                nums1[l_1] = nums1[l_m]
                l_m -= 1
            else:
                nums1[l_1] = nums2[l_n]
                l_n -=1
            l_1 -=1
        while l_n >= 0:
            nums1[l_1] = nums2[l_n]
            l_n -= 1
            l_1 -= 1
        print(nums1)

if __name__ == "__main__":
    solution = Solution()
    solution.merge(nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3)

5、时间与空间复杂度

时间复杂度: O(m+n)
指针移动单调递减,最多移动 m+n次。

空间复杂度:O(1)
直接对数组nums1原地修改,不需要额外空间。

备注

1、“问题”与“提示”转载于:
力扣(LeetCode)
https://leetcode-cn.com/problems/merge-sorted-array
2、代码参考:
JonnyHuang
https://leetcode-cn.com/problems/merge-sorted-array/solution/python3-shuang-zhi-zhen-xiu-gai-0mnfu-za-dee5/

你可能感兴趣的:(力扣算法,算法,leetcode,python)