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

      






  • 相关阅读:
    swoole 安装方法 使用即时聊天
    git的介绍以及简单应用
    curl的应用
    linux下监听和同步代码配置
    mac skim 修改背景色
    php 编译安装的一个 configure 配置
    mac mysql error You must reset your password using ALTER USER statement before executing this statement.
    yii2 控制器里 action 大小写组合造成的路由问题
    warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
    redis 自启动脚本
  • 原文地址:https://www.cnblogs.com/dosmile/p/6444480.html
Copyright © 2020-2023  润新知