每日一题——合并两个有序的数组

本文介绍了如何在保证升序的情况下,将有序数组B合并到有序数组A中,提供了一个C++类Solution的merge方法代码。

题目


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

数据范围:0≤n,m≤100,∣Ai∣<=100,∣Bi∣<=100

注意:

1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n。

2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印。

  1. 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]

思路


数组从后往前比较,较大的放入A的尾部。如果B先遍历完,A剩下的已经在数组前面符合题意的位置上。如果A先遍历完,则将B剩下的元素依次放入A中。

解答代码


class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
        int i = m-1;
        int j = n-1;
        int k = m+n-1;
        while (i>=0 && j>=0) {
            // 从后往前比较,将较大的元素放到A的尾部
            A[k--] = A[i]<=B[j] ? B[j--] : A[i--];
        }
        // 如果B中还有元素,则按顺序放到A里
        while (j>=0) {
            A[k--] = B[j--];
        }
    }
};
Python实现合并两个有序数组有多种方法,以下为你介绍几种常见的实现方式: ### 方法一:使用新列表存储有序元素 此方法创建一个新的列表`sorted`,通过比较`nums1``nums2`元素大小,将较小元素依次添加到`sorted`中,最后将`sorted`赋值给`nums1`。 ```python def merge(nums1, m, nums2, n): p, q = 0, 0 sorted = [] while p < m or q < n: if p == m: sorted.append(nums2[q]) q += 1 elif q == n: sorted.append(nums1[p]) p += 1 elif nums1[p] < nums2[q]: sorted.append(nums1[p]) p += 1 else: sorted.append(nums2[q]) q += 1 nums1[:] = sorted return nums1 ``` ### 方法二:逆向双指针法 该方法从后往前合并两个有序数组,大的元素优先插入`nums1`末尾,时间复杂度为$O(m + n)$,空间复杂度为$O(1)$。 ```python def merge(nums1, m, nums2, n): p1, p2, p = m - 1, n - 1, m + n - 1 while p1 >= 0 and p2 >= 0: if nums1[p1] > nums2[p2]: nums1[p] = nums1[p1] p1 -= 1 else: nums1[p] = nums2[p2] p2 -= 1 p -= 1 # 处理p2剩余元素 while p2 >= 0: nums1[p] = nums2[p2] p -= 1 p2 -= 1 return nums1 ``` ### 方法三:逐个插入元素法 此方法遍历`nums2`中的每个元素,将其插入到`nums1`适的位置,并移除末尾的一个零,最后对`nums1`排序。 ```python def merge(nums1, m, nums2, n): for num2 in nums2: if m == 0: nums1.insert(0, num2) nums1.remove(0) if m == 1 and nums1[0] <= num2: nums1.insert(1, num2) nums1.remove(0) if m == 1 and nums1[0] > num2: nums1.insert(0, num2) nums1.remove(0) for i in range(1, m): if nums1[i - 1] <= num2 <= nums1[i]: nums1.insert(i, num2) nums1.remove(0) break elif num2 < nums1[0]: nums1.insert(0, num2) nums1.remove(0) break elif num2 > nums1[i] and i < m - 1: continue else: nums1.insert(m, num2) nums1.remove(0) m = m + 1 nums1.sort() return nums1 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值