合并两个有序的数组

链接:合并两个有序的数组__牛客网
来源:牛客网
 

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

数据范围: 0≤n,m≤1000 \le n,m \le 1000≤n,m≤100,∣Ai∣<=100|A_i| <=100∣Ai​∣<=100, ∣Bi∣<=100|B_i| <= 100∣Bi​∣<=100


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

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

3. A 数组在[0,m-1]的范围也是有序的


import java.util.*;
public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        
    }
}

首先我们要知道,数组A已经被扩容了,同时我们这个题有两个思路,:

第一,合并+排序

这个方法就是需要将B数组都转移至数组A,然后我们在进行排序

这个方法虽然简单,但是效率不是很高。所以我们就得要换一种方法。

第二,双指针思想(合并+排序同时进行)

首先我们要设置三个指针,一个指针指向两个原数组,另外一个指针指向新的数组,这样我们就可以让指向的元素进行比较,较小或者较大的元素先进行移值(前提是这两个数组是有序的)。

但是有个比较的重要的是,我们的新的数组是从头开始进行移值还是,从尾开始?

其实我们这道题已经设置好了,只能从后往前,原因是我们的新的数组是从原来的旧的数组上扩容得到的,从前往后就会将原数组的前面的元素进行覆盖,导致数据丢失。

        int i =m-1;
        int k = n-1;
        int t = m+n-1;
        while(i>=0&&k>=0){
            if(A[i]>B[k]){
                A[t] = A[i];
                i--;
                t--;
            }else{
                A[t] = B[k];
                k--;
                t--;
            }
        }

所以我们就这样进行设计。

但是我们还有一种情况需要考虑,就是当我们其中一组数据结束后,另外一组数据并不知道是否也全部移值好,所以,这时我们就需要在进行判断,如果没有拍好,那就将剩下的全部按顺序拍进去(原本就是有序数组)。

            if(i>=0){
            while(i>=0){
                A[t] = A[i];
                i--;
                t--;
            }
        }
        if(k>=0){
            while(k>=0){
                A[t] = B[k];
                t--;
                k--;
            }
        }

所以总的代码段就是:

import java.util.*;
public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        int i =m-1;
        int k = n-1;
        int t = m+n-1;
        while(i>=0&&k>=0){
            if(A[i]>B[k]){
                A[t] = A[i];
                i--;
                t--;
            }else{
                A[t] = B[k];
                k--;
                t--;
            }
        }
        if(i>=0){
            while(i>=0){
                A[t] = A[i];
                i--;
                t--;
            }
        }
        if(k>=0){
            while(k>=0){
                A[t] = B[k];
                t--;
                k--;
            }
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值