C++每日一练8.合并两个有序的数组

Posted 鱼酱2333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++每日一练8.合并两个有序的数组相关的知识,希望对你有一定的参考价值。

合并两个有序的数组

  • 算法1
class Solution 
public:
    void merge(int A[], int m, int B[], int n) 
          int i=0,j=0,p=0;
        int c[m+n];//定义辅助数组C
        while(i<m&&j<n)
            c[p++]=A[i]<=B[j]?A[i++]:B[j++];//将A[i]和B[j]中小的那个丢入C中
             
        while(i<m)//如果A中有剩余
            c[p++]=A[i++];
        
        while(j<n)//如果B中有剩余
            c[p++]=B[j++];
        
        for(int i=0;i<p;i++)A[i]=c[i];//因为题目要求,将C数组拷贝到A数组中
    
;
  • 算法2
class Solution 
public:
    void merge(int A[], int m, int B[], int n) 
        int i=m-1,j=n-1,p=m+n-1;//i,j指针指向原末尾,p指针指向合并后的A末尾
        while(~i&&~j) // ~i  <==> i>=0,因为-1取反过后返回的是0,位运算一般情况比其他运算符速度要快
            A[p--]=A[i]>B[j]?A[i--]:B[j--];//合并A、B数组, 比较i,j指针指向的元素,将大的那个丢进去
        
        while(~j)//如果B数组还有剩余,则直接全部移到A数组中
            A[p--]=B[j--];
        
        /*此处如果出现A数组有剩余的情况,理论上应该执行while(i>=0)A[p--]=A[i--]
        但是如果A有剩余必然有p==i(出现剩余的情况,只有可能一个出现剩余,不可能出现AB数组都剩余的情况)
        (如果出现AB都剩余,就跟第一个for循环矛盾了)
        既然对于指针p==i,那么此时这个while循环就会显得很多余                    
        */   
    
;

以上是关于C++每日一练8.合并两个有序的数组的主要内容,如果未能解决你的问题,请参考以下文章

「 每日一练,快乐水题 」88. 合并两个有序数组

蓝桥Java每日一练————3.合并两个有序链表

C++每日一练16.合并两个排序的链表

每日一练(day01)

C++每日一练13.最小的k个数

每日一练(day02 手撕 KMP)