88合并两个有效数组

题意:将排序好的数组nums2合并到nums1中,使得nums1成为一个有序数组。假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

方法一:双指针方法,从后往前
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 = n+m-1
            while p1>=0 and p2>=0:
            	if nums1[p1]<nums2[p2]:
            		nums1[p] = nums2[p2]
            		p2 -=1
            	else:
            		nums1[p] = nums1[p1]
            		p1 -=1
            	p -=1
            nums1[:p2+1]=nums2[:p2+1]

时间复杂度为O(N+M)
空间复杂度为O(1)

nums1 = A 和 nums1[:] = A 的不同之处:
nums1 = A # 更改 nums1 这一变量名所指向的对象。让 nums1 变量指向 A 所指向的对象,改变了原对象。
nums1[:]=A #只是对nums1所指向的对象赋值,只是值的改变,仍然是原对象。满足原地修改的要求。
方法二:双指针,从前往后
该方法需要先将nums1复制出来nums1_copy,然后以此和nums2进行比较,将小值移入到nums1中。

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
                    nums1_copy = nums1[:m]
                    nums1[:]=[]
                    p1=p2=0 
                    while p1<m and p2<n:
                    	if nums1_copy[p1]<nums2[p2]:
                    	    nums1.append(nums1_copy[p1])  
                    	    p1 +=1 
                    	 else:
                    	    nums1.append(nums2[p2]) 
                    	    p2 +=1 
                    if p1<m:
                       nums1[p1+p2:]=nums1_copy[p1:]
                    if p2<n: 
                       nums1[p1+p2:]=nums2[p2:]

时间复杂度 : O(n+m)
空间复杂度 : O(m)
方法二已经取得了最优的时间复杂度O(n+m),但需要使用额外空间,这是由于在从头改变nums1的值时,需要把nums1中的元素存放在其他位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值