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指针的运用还是不太熟练,第一时间想到的方法和标准答案是类似的,但是由于不熟练导致舍近求远了。
373

被折叠的 条评论
为什么被折叠?



