算法练习:合并两个有序数组【2021-10-19】

5. 合并两个有序数组(未独立做出来)

5.1、题目描述

给你两个有序整数数组 nums1nums2,请你将 nums2 合并到 nums1使 nums1 成为一个有序数组。

说明:

  • 初始化 nums1nums2 的元素数量分别为 mn

  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

 输入:
 nums1 = [1,2,3,0,0,0], m = 3
 nums2 = [2,5,6],       n = 3
 ​
 输出:[1,2,2,3,5,6]

提示:

  • -10^9 <= nums1[i], nums2[i] <= 10^9

  • nums1.length == m + n

  • nums2.length == n

5.2、解法

方法一:合并后排序(不推荐)

思路:

将两个数组合并之后再排序,

没有利用两个数组本身就有序这一个特点

官方解法:

 class Solution {
   public void merge(int[] nums1, int m, int[] nums2, int n) {
     System.arraycopy(nums2, 0, nums1, m, n);
     Arrays.sort(nums1);
   }
 }
 

复杂度分析

  • 时间复杂度:O(m+nlog(m+n))

  • 空间复杂度:O(1)

补充:arraycopy方法的使用

 public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

参数

  • src -- 这是源数组.

  • srcPos -- 这是源数组中的起始位置。

  • dest -- 这是目标数组。

  • destPos -- 这是目标数据中的起始位置。

  • length -- 这是一个要复制的数组元素的数目。

方法二:双指针从后往前

思路

从结尾开始改写 nums1 的值又会如何呢?这里没有信息,因此不需要额外空间。

这里的指针 p 用于追踪添加元素的位置。

image-20201207203716288

官方解法:  ​

 class Solution {
   public void merge(int[] nums1, int m, int[] nums2, int n) {
     
     int p1 = m - 1;
     int p2 = n - 1;
     
     int p = m + n - 1;
 ​
    
     while ((p1 >= 0) && (p2 >= 0))
       
       nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];
 ​
     
     System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
   }
 }

复杂度分析

  • 时间复杂度:O(n+m)

  • 空间复杂度:O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值