首页 > 其他分享 >LeetCode-88题合并两个有序数组

LeetCode-88题合并两个有序数组

时间:2023-11-09 18:01:46浏览次数:34  
标签:int 元素 nums1 88 数组 LeetCode nums2 指针

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

题解1

直接将两个数组相加,采用java.util下的 Arrays.sort() 方法重新排序,简单有效。

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

LeetCode-88题合并两个有序数组_合并有序数组


Arrays.sort小数组底层-插入排序

采用数组nums={1,4,7,2,5,6}作为例子

1.将数组传入快速排序中排序;

LeetCode-88题合并两个有序数组_数组_02

2.数组长度减1小于286的进入这个排序方法;

LeetCode-88题合并两个有序数组_快速排序_03

LeetCode-88题合并两个有序数组_双指针_04

3.很明显数组长度小于47的时候则优先使用插入排序

LeetCode-88题合并两个有序数组_双指针_05

4.按左边进行插入排序:

① 当数组中的两个元素进行比较大小时,先取出右边的元素存入ai中,

② 将右边的元素与左边的元素进行比较;

Ⅰ、如果右边的元素大于等于左边的元素,则插入原位置;

Ⅱ、若果右边的元素小于左边的元素,会将左边所有大于右边的元素后移一位,循环一次则指针索引 j--,代表右边的元素前移一位,最终覆盖原有元素。

LeetCode-88题合并两个有序数组_插入排序_06

时间复杂度为O( (m+n)log(m+n) )。

题解2

采用双指针和临时数组的方法对两数组排序;

  1. 同时遍历两个数组,如果nums1中取出的元素小于nums2中取出的元素,则将nums1中的元素放入临时数组;
  2. 如果nums1中取出的元素大于等于nums2中取出的元素,则将nums2中的元素放入临时数组;
  3. 将临时数组中的元素放入nums1中;

时间复杂度O(m+n),空间复杂度O(m+n);

public void merge(int[] nums1, int m, int[] nums2, int n) {
        //建立临时数组
        int k = m + n;
        int[] temp = new int[k];

        //循环数组,建立双指针比较
        for (int i = 0, nums1Index = 0, nums2Index = 0; i < k; i++) {
            //数组1中指针超过索引长度,代表数组1的元素已取完则将数组2中元素放入临时数组
            if (nums1Index >= m) {
                temp[i] = nums2[nums2Index++];
            } else if (nums2Index >= n) {
                //数组2中指针超过索引长度,则将数组1中的元素放入临时数组
                temp[i] = nums1[nums1Index++];
            } else if (nums1[nums1Index] < nums2[nums2Index]) {
                //如果数组1中指针指的元素小于数组2中指针指的元素,将数组1中的元素放入临时数组
                temp[i] = nums1[nums1Index++];
            } else {
                //数组1中指针指的元素大于等于数组2中指针指的元素,将数组2的元素放入临时数组
                temp[i] = nums2[nums2Index++];
            }
        }
        //将临时数组放入数组1中
        for (int i = 0; i < temp.length; i++) {
            nums1[i] = temp[i];
        }

LeetCode-88题合并两个有序数组_合并有序数组_07

题解2优化

  1. 题解2中是创造了一个临时数组,其实数组nums1中的长度为m+n可以将两个数组同时放入的;
  2. 采用双指针和一个数组的方法;
  3. 取出两个数组指向的元素,元素大的倒序放入nums1数组中。

时间复杂度O(m+n),空间复杂度O(1);

 public void merge3(int[] nums1, int m, int[] nums2, int n) {
        //nums1有效元素为m个,但nums1的初始长度为m+n,我们可以将两个数组比较大的元素放入数组1中后面的位置
        for (int i = m + n - 1, nums1Index = m - 1, nums2Index = n - 1; i >= 0; i--) {
            if (nums1Index < 0) {
                //如果nums1中的指针小于0,则代表nums1中元素已经没有了,将nums2中的元素放入nums1中的指定位置
                nums1[i] = nums2[nums2Index--];
            } else if (nums2Index < 0) {
                //如果nums2中的指针小于0,直接退出即可,
                break;
            } else if (nums1[nums1Index] <= nums2[nums2Index]) {
                //如果nums2中的元素大于等于nums1中的元素,将nums2中的元素放入数组对应位置
                nums1[i] = nums2[nums2Index--];
            } else {
                //如果nums2中的元素小于nums1中元素,将nums1中的元素取出放入对应位置
                nums1[i] = nums1[nums1Index--];
            }
        }
    }


LeetCode-88题合并两个有序数组_双指针_08


标签:int,元素,nums1,88,数组,LeetCode,nums2,指针
From: https://blog.51cto.com/u_16280730/8285062

相关文章

  • 384. 打乱数组(中)
    目录题目法一、Fisher-Yates法二、鸽尾式洗牌法(RiffleShuffle)题目给你一个整数数组nums,设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是 等可能 的。实现Solutionclass:Solution(int[]nums)使用整数数组nums初始化对象int[]reset()重设数......
  • [DataX] DataX动态传参 - Column数组传参
     今天在CMD中执行命令,想着怎么动态传递列名,找了好久,没看到网上有写如何传列名的,自己试了下,找了很多双引号的转义,结果都不行,比如三个双引号"""(完全没效果),unicode的\u0022(转义成\"了,不是想要的").最后在Github找到了答案。column作为变量传到json中解析不正确·Issue#19......
  • LeetCode #1131 Maximum of Absolute Value Expression 绝对值表达式的最大值
    安装Flutter环境首先配置flutter3开发环境,照着官方教程傻瓜式安装即可。>>安装和环境配置|Flutter中文文档|Flutter中文开发者网站注意在国内网络环境下需要进行一些额外的环境配置:>>在中国网络环境下使用Flutter|Flutter中文文档|Flutter中文开发者网站Description......
  • c++数组最大长度(干货)
    ​    在编译器里,每种类型的变量定义数组的时候都有一个数组大小,而这个大小对于不同的变量而言有不同的上限,这里的最大长度更准确的来说应该是系统堆的最大值。字符类型数组一个字符占1byte大小,八位,所以,理论上,在一个64位的编译器中,一个字符数组的最大长度是2147483648,......
  • C语言程序设计 数组,结构体和指针练习题
    涉及知识点:数组,结构体和指针分析以下程序的运行结果:#include"stdio.h"structsp{inta;int*b;}*p;intd[3]={10,20,30};structspt[3]={70,&d[0],80,&d[1],90,&d[2]};voidmain(){p=t;printf(&......
  • LeetCode_0042. 接雨水
    题目描述给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨......
  • js:遍历数组
    1.循环类型forEach()forEach();语法forEach(callbackFn)forEach(callbackFn,thisArg)例子/****@param{any}element数组中正在处理的当前元素*@param{number}index数组中正在处理的当前元素的索引。*@param{Array}array1调用了forEach()的数组本身*/co......
  • 迅为RK3588开发板编译Buildroot
    Buildroot是一款集成的编译集合包,解决了以前交叉编译麻烦的问题,本小节将介绍buildroot镜像的编译流程,分为单独编译和完整全自动编译。首先输入以下命令,选择buildroot系统的配置文件sourcebuildroot/build/envsetup.sh默认配置文件会覆盖掉rk3588_linux/buildroot/output/rock......
  • NTC 10K 3380 阻值对照表的数组
    因网上没有NTC10K3380的阻值温度对照数组,所以分享各种格式,以供使用直接根据阻值对照表的数组data=[202.2693,191.0637,180.5546,170.6944,161.4387,152.7468,144.5807,136.9052,129.6879,122.8985,116.5089,110.4932,104.8272,99.4883,94.4558,89.7101,85......
  • 【从零开始学习Go语言】八.Go语言的数组切片引用类型与值类型(总结)
    【从零开始学习Go语言】Go语言的数组与切片引用类型与值类型一.数组二.多维数组三.切片四.值类型与引用类型一.数组go语言的数组在之前的一些例子中有引用过,go的数组在创建时需要声明存储数据的类型,长度,并且长度在确定后便不可增加,类似python中的元组数组的声明方式有多种:第一种......