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

 

posted @ 2015-07-23 11:08  曾可爱  阅读(109)  评论(0编辑  收藏  举报