LeetCode#88 Merge Sorted Array

Problem Definiton:

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.

The number of elements initialized in nums1 and nums2 are m and n respectively.

 

Solution:

1)如果忽略 “You may assume that nums1 has enough space”,则要先在另一个额外的数组中保存所有元素,再复制回nums1,这样元素一定是最少的:

 1 def merge(nums1, m, nums2, n):

 2         nums=[0]*(m+n)

 3         i,j,k=0,0,0

 4         while i<m and j<n:

 5             if nums1[i]<=nums2[j]:

 6                 nums[k]=nums1[i]

 7                 i+=1

 8             else:

 9                 nums[k]=nums2[j]

10                 j+=1

11             k+=1

12         while i<m:

13             nums[k]=nums1[i]

14             i+=1

15             k+=1

16         while j<n:

17             nums[k]=nums2[j]

18             j+=1

19             k+=1

20         nums1[:]=[]                 ######

21         nums1+=nums

 

算法本身没什么好说的,这样要注意的是注释那一行。原题要求不返回nums1而是直接修改。

有一个标签可能叫作aList,它指向内存中的一块连续空间,表示一个数组。

当这个标签作为merge的第一个参数,调用merge时,一个叫做nums1的标签也被挂在了这块内存上。

所以如果把以上程序的第20和21行写成nums1=nums,则相当于:

也就是说,aList指向的那块内存内容并没有被修改。

而如果写成

nums1[:]=[]             

nums1+=nums

的意思就相当于,把aList指向的数组(内存)清空,然后把nums的元素一个个append进去。

 

2)而如果不忽略nums1 has enough space这个条件,就可以在nums1上直接操作。从nums1的末尾开始,倒着来归并。

 

 1 def merge(nums1, m, nums2, n):

 2     p=m-1

 3     q=n-1

 4     r=m+n-1

 5     while q>=0:

 6         if p<0 or nums2[q]>=nums1[p]:

 7             nums1[r]=nums2[q]

 8             q-=1

 9         else:

10             nums1[r]=nums1[p]

11             p-=1

12         r-=1

 

你可能感兴趣的:(LeetCode)