列表

详情


BM87. 合并两个有序的数组

描述

给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组

数据范围:

注意:
1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n
2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印
3. A 数组在[0,m-1]的范围也是有序的

示例1

输入:

[4,5,6],[1,2,3]

输出:

[1,2,3,4,5,6]

说明:

A数组为[4,5,6],B数组为[1,2,3],后台程序会预先将A扩容为[4,5,6,0,0,0],B还是为[1,2,3],m=3,n=3,传入到函数merge里面,然后请同学完成merge函数,将B的数据合并A里面,最后后台程序输出A数组

示例2

输入:

[1,2,3],[2,5,6]

输出:

[1,2,2,3,5,6]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 2ms, 内存消耗: 344KB, 提交时间: 2021-03-15

/**
 * 
 * @param A int整型一维数组 
 * @param ALen int A数组长度
 * @param B int整型一维数组 
 * @param BLen int B数组长度
 * @return void
 */
void merge(int* A, int ALen, int m, int* B, int BLen, int n) {
    // write code here
    int num = n + m -1;
    m -= 1;
    n -= 1;
    while(n >= 0 && m >= 0) {
        if(A[m] > B[n]) {
            A[num] = A[m];
            m -= 1;
        }
        else {
            A[num] = B[n];
            n -= 1;
        }
        num -= 1;
    }
    if(m < 0) {
        for(int i = 0; i <= n; i++) {
            A[i] = B[i];
        }
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2021-04-04

/**
 * 
 * @param A int整型一维数组 
 * @param ALen int A数组长度
 * @param B int整型一维数组 
 * @param BLen int B数组长度
 * @return void
 */
void merge(int* A, int ALen, int m, int* B, int BLen, int n) {
    // write code here
    int index = m+n-1;
    m--;
    n--;
    while(m>=0 && n>=0)
    {
        if(A[m]>B[n])
        {
            A[index] = A[m];
            m--;
            index--;
        }
        else
        {
            A[index] = B[n];
            n--;
            index--;
        }
     }
    while(n>=0)
    {
        A[index--] = B[n--];
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2021-03-03

/**
 * 
 * @param A int整型一维数组 
 * @param ALen int A数组长度
 * @param B int整型一维数组 
 * @param BLen int B数组长度
 * @return void
 */
void merge(int* A, int ALen, int m, int* B, int BLen, int n) {
    int tailA = ALen - 1;
    int tailB = BLen - 1;
    int tail = ALen + BLen - 1;
    while (tailA >= 0 && tailB >= 0) {
        A[tail--] = A[tailA] > B[tailB] ? A[tailA--] : B[tailB--];
    }
    
    while (tailB >= 0) {
        A[tail--] = B[tailB--];
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-03-22

/**
 * 
 * @param A int整型一维数组 
 * @param ALen int A数组长度
 * @param B int整型一维数组 
 * @param BLen int B数组长度
 * @return void
 */
void merge(int* A, int ALen, int m, int* B, int BLen, int n) {
    // write code here
    int num;
    num = n + m - 1;
    m--;
    n--;
    while (m >= 0 && n >= 0) {
        if (A[m] > B[n]){
            A[num] = A[m];
            m--;
        } else {
            A[num] = B[n];
            n--;
        }
        num--;
    }
    
    if (m < 0) {
        for (int i = 0; i <= n; i++) {
            A[i] = B[i];
        }
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2021-07-17

/**
 * 
 * @param A int整型一维数组 
 * @param ALen int A数组长度
 * @param B int整型一维数组 
 * @param BLen int B数组长度
 * @return void
 */
void merge(int* A, int ALen, int m, int* B, int BLen, int n) {
    // write code here
       int a = m-1;
        int b = n-1;
        for(int i = m+n-1 ; i >= 0 ; i--)//需要填m+n次
        {
            if(b<0||(a>=0&&A[a]>=B[b]))
            //B数组中的数全部用完了就填A数组中的数 a数组中的数没有用完,并且A数组的数大
            {
                A[i]=A[a];
                a--;
            }
            else
            {
                A[i]=B[b];
                b--;
            }
        }
    
}

上一题