合并有序数组

本文介绍了LeetCode上的一个问题——合并两个有序数组。通过两种Java解决方案进行解析,一种是直接在nums1数组上移动元素,另一种是创建临时数组tempArray进行合并。这两种方法分别在时间和空间效率上有不同优势,可以根据实际需求选择合适的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


引言

力扣题目【合并两个有序数组】描述 -> 传送门
所用语言:Java
第一种答案:执行用时 1 ms,内存消耗 38.4 MB
第二种答案:执行用时 0 ms,内存消耗 38.6 MB


正文

今天的题目是简单题,也确实是简单,这里就不详细讲了,可以直接看代码

答案①

主要的思路:在 num1 数组上进行数据的移动,如果 num2 有符合的数据要插入进来,就将数据往后移,空出一个位置来接收数据。所以较为节省空间

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int tail = m;
    int ptrTwo = 0;
    for (int i = 0; i < tail && ptrTwo < n; ) {
        if (nums2[ptrTwo] < nums1[i]) {
            for (int temp = tail; temp > i; temp--) {
                nums1[temp] = nums1[temp - 1];
            }
            tail += 1;
            nums1[i] = nums2[ptrTwo];
            ptrTwo++;
            i++;
        } else {
            i++;
        }
    }

    if (ptrTwo < n) {
        do {
            nums1[tail++] = nums2[ptrTwo++];
        } while (ptrTwo < n);
    }
}

答案②

主要的思路:重新定义一个数组 tempArray 并复制 num1 的数据,然后 tempArray 数组和 num2 数组中的数据逐个比较,逐个放入 num1 数组中。所以较为节省时间

public void merge(int[] nums1, int m, int[] nums2, int n) {
     int[] tempArray = new int[m];
     for (int i = 0; i < m; i++) {
         tempArray[i] = nums1[i];
     }

     int ptrOne = 0;
     int ptrTwo = 0;
     int index = 0;

     while (ptrOne < m && ptrTwo < n) {
         if (tempArray[ptrOne] <= nums2[ptrTwo]) {
             nums1[index++] = tempArray[ptrOne++];
         } else {
             nums1[index++] = nums2[ptrTwo++];
         }
     }

     if (ptrOne < m) {
         do {
             nums1[index++] = tempArray[ptrOne++];
         } while (ptrOne < m);
     } else if (ptrTwo < n) {
         do {
             nums1[index++] = nums2[ptrTwo++];
         } while (ptrTwo < n);
     }
 }

最后

当然,肯定还会有很好的办法的。比如因为给出的两个数组都是有序的,所以在采用答案①的思路的时候,可以做一下修改,进行一次批量插入多个数据。这样就可以减少移动 num1 数组中的数据的次数,时间上会更快 😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值