• LeetCode | Merge Sorted Array


     

    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]了
            }
          }
        }
    }
    

      






  • 相关阅读:
    注意
    被虐的很惨
    在cmd中可以运行java,但是不能用javac
    Linux常用命令
    安装JDK和eclipse
    重装win7
    小希的迷宫
    并查集——The Suspects
    BFS宽度优先搜索
    括号匹配
  • 原文地址:https://www.cnblogs.com/dosmile/p/6444480.html
Copyright © 2020-2023  润新知