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 (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are m andn respectively.
//思路是倒着合并两个数组,这样在合并时就不需要将数组A中的元素向后移动以插入B[j]了 //算法复杂度为O(n+m)
public class Solution { public void merge(int A[], int m, int B[], int n) { int i=m-1; // A[0] - A[m-1] int j=n-1; // B[0] - B[n-1] int k=m+n-1; // 合并之后:A[0] - A[m+n-1] while(i>=0 && j>=0) { A[k--] = A[i] > B[j] ? A[i--] : B[j--]; //倒着合并,每次取大者放入后边,取完之后对应标志下标减1 } /*while (i >= 0) //取完之后,若A有剩,其实并不需要处理,保持剩下的几个元素不动就行 A[k--] = A[i--] ; */ while(j>=0) { //取完之后,若B有剩,则B剩下的那几个元素一定是两个数组中最小的几个,且有序 A[k--] = B[j--]; //依次继续从后写入A[]即可 } } }
自己的正向遍历的笨方法:
思想是每次取B[j],然后为其在A[]中找到正确的位置插入,再后移A中的元素
public class Solution { public void merge(int A[], int m, int B[], int n) { if (n==0) return; //如果n=0,即B[]中无任何元素,就无需对A[]做任何改动 if (m==0) { //如果m=0,即A[]中无任何元素,就把B[]复制给A[] for(int i=0;i<n;i++) A[i] = B[i]; return; } for (int j=0; j<n; j++){ //j代表对数组B[]的遍历,取出B[j]到A[]中找正确位置 if (B[j] >= A[m-1+j]) {A[m+j] = B[j]; continue;} //如果B[j]比现任的A[]中最大元素还大,就直接把B[j]贴在A[]最后 for (int i=0; i<m+j; i++){ //i代表对数组A[]的遍历,为B[j]定位位置,对A[m-1+j]的比较在上边if中完成 if (A[i] >= B[j]){ //表示找到了B[j]应该插入的正确位置 for(int k=m-1+j;k>=i;k--) { A[k+1] = A[k]; } //则把包括A[i]的A[i]-A[m-1+j]都向后移一位,此时A[i]=A[i+1] A[i] = B[j]; //把B[i]插入到A[i]的位置 break; } //break; //注意:不能把break放在这,否则当A[i] < B[j]时,也会break,转而执行外层循环的if判断了 //而不是向后继续找A[i] >= B[j]的A[i]了 } } } }