leetcode 88. Merge Sorted Array 合并有序数组

本文详细解析了LeetCode第88题“合并两个有序数组”的三种解题方法,包括从前到后比较插入、从后往前比较覆盖以及直接追加再排序的策略,对比了不同方法的时间复杂度。

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

今日份leetcode 88. Merge Sorted Array
Description:
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:
The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.

Example:
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
看到这个题我的想法是,创建一个长度为m+n的数组nums3,然后从前往后依次比较两个数组的元素大小,把小的元素依次放入新数组。

方法一

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] nums3 = new int[nums1.length]; //存放排好序的数组
        int i ,k, j; //i充当数组nums1的指针
        j=k=0;
        for(i=0;i<m&&j<n;i++){
            if(nums1[i]<=nums2[j])
                nums3[k++]=nums1[i];
            else{
                nums3[k++]=nums2[j++];
                i--;
            }
            }        
        if(i<m){
            for(;i<m;i++)
                nums3[k++]=nums1[i];
        }
        if(j<n){
            for(;j<n;j++)
                nums3[k++]=nums2[j];
        }
        for(int i1=0;i1<nums1.length;i1++){   //这里在将数组nums3赋给nums1时需要注意
            nums1[i1]=nums3[i1];
        }
    }
}

虽然时间复杂度不是很高,但在代码逻辑上有些复杂。另外在参数传递的方面产生了一点问题,一会在后面记录一下,现在先解题。

方法二

class Solution {
          public void merge(int A[], int m, int B[], int n) {
               int i=m-1; //记录nums1从后往前的索引
		int j=n-1;  //记录nums2从后往前的索引
		int k = m+n-1;  //记录合并后的数组从后往前的索引
		while(i >=0 && j>=0)
		{
			if(A[i] > B[j])
				A[k--] = A[i--];
			else
				A[k--] = B[j--];
		}
		while(j>=0)  
			A[k--] = B[j--];
    }
}

此方法的思路与我又是恰好相反的,它是从后往前排序,即先找数大的,然后把它放在后面。这样还能有机会省去某个数组最前面一些数的排序。

方法三

class Solution {
    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        if (nums2.length==0 || n==0);
        for (int i=m,j=0;j<n;i++,j++) nums1[i]=nums2[j];
        Arrays.sort(nums1);
    }
}

这也是一个很简单的方法,但大多数sort方法的时间复杂度是 O(n*log(n)),所以单看时间复杂度此方法不如前两个方法。

关于方法一中提到的Java中方法参数的问题我单独写了一个笔记来整理记录:
https://blog.youkuaiyun.com/weixin_39979073/article/details/84642318

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值