Given two sorted integer arrays A and B, merge B into A as one sorted array.
Note:
You may assume that A has enough space to hold additional elements from B. The number of elements initialized in A and B are m and n respectively.
题意:给定两已排好的数组,将B合并到A中,A足够长。
思路:归并排序,只不过这题是要保存在A中,题目中的意思是不要开辟新的空间,所以常规的从左到右的归并排序行不通,我们可以从后面开始。这就涉及一个问题了:将数组A和数组B的最后元素相比较后,较大元素放在哪,即下标为多少?因,题中说,A足够大,所以至少m+n个位置,这样我们就可以将较大值放在下标为m+n-1处了。还有一个问题就是,若n>m,这样,主体的算法结束后,我们要考虑,n中的元素如何处理, 毫无疑问,此时m=0了,所以只需将B中的元素对应的赋给A中即可,代码如下:
1 class Solution { 2 public: 3 void merge(int A[], int m, int B[], int n) 4 { 5 if(n==0) return; 6 7 while(m>0&&n>0) 8 { 9 if(A[m-1]>B[n-1]) 10 { 11 A[m+n-1]=A[m-1]; 12 m--; 13 } 14 else 15 { 16 A[m+n-1]=B[n-1]; 17 n--; 18 } 19 } 20 while(n>0) 21 { 22 A[m+n-1]=B[n-1]; //m不写也行,此时,m=0 23 n--; 24 } 25 } 26 };