LeetCode 算法题库【88】——合并两个有序数组

合并两个有序数组

题目描述:

timu

解题思路:
  • 第一种:这个方法是我一开始想到的,我想着因为要把nums2的数放到nums1里头的后面,然后把0代替,所以我就直接用for把后面的0的位置的数字换成nums2的数,最后用sort()排序得到最后的nums1。时间复杂度也不是很好,需要进一步改进。
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.
        """
        lens = len(nums1)
        for i in range(m, lens):
            nums1[i] = nums2[i-m]
        nums1.sort()

1

  • 第二种:这个方法实在第一种方法下的稍微改进,只用了一行代码,直接重新把nums1的前面m个数加上nums2的数组成一个列表,然后用sorted()排序。
  • 虽然代码量很少,但是时间复杂度比较差,为O((n+m)log(n+m))。
class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        Do not return anything, modify nums1 in-place instead.
        """
        nums1[:] = sorted(nums1[:m] + nums2)

2

  • 第三种:我通过学习发现了可以用双指针的方法来写,这里有两种写法,一种从前往后比较,这种方法发现如果要从前往后的话需要重新再设一个数组来存放数组,会增大空间复杂度,所以这里我说下从后往前比较的这个双指针方法。这个方法不需要重新定义一个数组,可以直接在nums1中进行操作,因为这两个数组都是有序的,所以这个方法主要是在于通过比较nums1的第m个数字和nums2的第n的数字大小,然后把最大的放到最后,然后最大的那个数组比较的数字位置往前移一位,以此类推。如果最后nums2中的数字全部都通过比较进了nums1里,然后直接输出即可,但是如果等nums1中的数字都比较完了,而nums2中还有剩余数字未被比较,说明这些数字是最小的了,所以直接放在nums1数组最前面就可以了。
  • 这个方法的时间复杂度小了很多,为O(n+m),空间复杂度也只有O(1)。
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.
        """
        p1 = m-1
        p2 = n-1
        p = m+n-1
        while p1 >= 0 and p2 >= 0:
            if nums2[p2] > nums1[p1]:
                nums1[p] = nums2[p2]
                p2 -= 1
            else:
                nums1[p] = nums1[p1]
                p1 -= 1
            p -= 1
        if p2 >= 0:
            nums1[:p2 + 1] = nums2[:p2 + 1]

3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值