leetcode刷题笔记(二)之88. 合并两个有序数组

88. 合并两个有序数组

题目地址
第一版答案

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        i=j=0
        while nums2 :
            n1=nums1[i]
            n2=nums2[j]
            
            if n1<=n2 and i<m:
                i+=1
            else:
                nums1.insert(i,n2)
                nums1.pop()
                i+=1
                j+=1
                m+=1
                if i==m+1 or j==n:
                    break
            print(nums1)

我像的是2里面有小于1的就插到前面但是时间复杂度是O((M+N)Log(M+N))
问题在于

nums1.insert(i,n2)
nums1.pop()

nums1.insert(i, ...):在列表中间插入元素是 O(m+n) 操作,因为需要移动后面所有元素。最坏情况下(nums2所有元素都需要插入到nums1开头),这两个操作会被执行 n 次所以总时间复杂度是 O(n × (m+n)) = O(mn + n²),当 m≈n 时就是 O(n²)
从前向后排列符合直觉但是慢,如果要做到O(m+n) 则需要从后向前插入。
以下是官方答案:
在这里插入图片描述

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        sorted = []
        p1, p2 = 0, 0
        while p1 < m or p2 < n:
            if p1 == m:
                sorted.append(nums2[p2])
                p2 += 1
            elif p2 == n:
                sorted.append(nums1[p1])
                p1 += 1
            elif nums1[p1] < nums2[p2]:
                sorted.append(nums1[p1])
                p1 += 1
            else:
                sorted.append(nums2[p2])
                p2 += 1
        nums1[:] = sorted

为什么没想到:
1被题目思维定势了,说是要在nums1上修改,我就真的在nums1上insert pop了,实则向复杂了,元素的定位反而变得复杂,应该和标注答案一样最后赋值就行了。
2指针的运用还是不太熟练,第一时间想到的方法和标准答案是类似的,但是由于不熟练导致舍近求远了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值