【力扣日记】088合并两个顺序配列|面接问题10.01
タイトルの説明
2つの秩序整数配列nums 1およびnums 2が与えられ、nums 2がnums 1に結合され、num 1が秩序配列になる.
説明:nums 1とnums 2を初期化する要素の数は、それぞれmとnです.nums 1にはnums 2の要素を保存するのに十分な空間(空間サイズがm+n以上)があると仮定できます.
入力:nums 1=[1,2,3,0,0],m=3 nums 2=[2,5,6],n=3
出力:[1,2,2,3,5,6]
アルゴリズムの考え方
1、内蔵関数
2、ダブルポインタ
2つの配列の1つの要素のみを比較します.
実行時間:28 ms、すべてのPython 3コミットで99.22%のユーザーメモリ消費量:12.9 MBを破り、すべてのPython 3コミットで46.72%のユーザーを破った
3、popを使う
考えは二重ポインタに等しいが、もっと簡潔だ.
実行時間:32 ms、すべてのPython 3コミットで95.35%のユーザーを破った
4、その場で修正
実行時間:36 ms、すべてのPython 3コミットで89.15%のユーザーを破った
2つの秩序整数配列nums 1およびnums 2が与えられ、nums 2がnums 1に結合され、num 1が秩序配列になる.
説明:nums 1とnums 2を初期化する要素の数は、それぞれmとnです.nums 1にはnums 2の要素を保存するのに十分な空間(空間サイズがm+n以上)があると仮定できます.
入力:nums 1=[1,2,3,0,0],m=3 nums 2=[2,5,6],n=3
出力:[1,2,2,3,5,6]
アルゴリズムの考え方
1、内蔵関数
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
nums1[m:]=nums2
nums1.sort()
2、ダブルポインタ
2つの配列の1つの要素のみを比較します.
i,j,ls=0,0,[]
while i<m and j<n:
if nums1[i]>nums2[j]:
ls.append(nums2[j])
j+=1
elif nums1[i]<=nums2[j]:
ls.append(nums1[i])
i+=1
if i==m:nums1[:]=ls+nums2[j:]
else:nums1[:]=ls+nums1[i:m]
実行時間:28 ms、すべてのPython 3コミットで99.22%のユーザーメモリ消費量:12.9 MBを破り、すべてのPython 3コミットで46.72%のユーザーを破った
3、popを使う
考えは二重ポインタに等しいが、もっと簡潔だ.
ls,A[:]=[],A[:m]
while A and B:
if A[-1]>B[-1]:
ls.append(A.pop())
else:
ls.append(B.pop())
if A:A[:]=A+ls[::-1]
else:A[:]=B+ls[::-1]
実行時間:32 ms、すべてのPython 3コミットで95.35%のユーザーを破った
4、その場で修正
A[:],i,j=A[:m],0,0
while i<len(A) and j<n:
if B[j]<=A[i]:
A.insert(i,B[j])
j+=1
else:i+=1
if j<n:A.extend(B[j:n])
実行時間:36 ms、すべてのPython 3コミットで89.15%のユーザーを破った