LeetCode算法题-Merge Sorted Array(Java实现)

小白水平理解面试经典题目LeetCode 88 Merge Sorted Array【Java实现】 你好,今天做的是leetcode 88题,是一道数组类题目,它也是总被问道的一个类型。 阅读详情

这是悦乐书的第161次更新,第163篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第20题(顺位题号是88)。给定两个排序的整数数组nums1和nums2,将nums2中的元素合并到nums1中,并且作为一个排序的数组。在nums1和nums2中初始化的元素个数分别为m和n。假设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]

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

给的条件很清晰,nums1的长度大于等于m+n的和,nums2的元素是肯定可以全部放进nums1的,既如此,那我们是不是可以先把nums2中的元素添加进nums1,从下标m开始,移入n个新的元素,然后再对nums1进行排序,最后得到新的nums1数组。排序算法使用了冒泡排序,当然使用其他的排序算法也是可以的。

public void merge(int[] nums1, int m, int[] nums2, int n) {
    for (int i=m, k=0; i<nums1.length && k < n ; i++,k++) {
        nums1[i] = nums2[k];
    }
    for (int j=0; j<nums1.length-1; j++) {
        for (int h=0; h<nums1.length-1-j; h++) {
            if (nums1[h] > nums1[h+1]) {
                int temp = nums1[h+1];
                nums1[h+1] = nums1[h];
                nums1[h] = temp;
            }
        }
    }
}

03 第二种解法

上面的解法的时间复杂度是O(n^2),那能不能再降低点?让其更快一点?让我们来借助例子分析下。

nums1 = [1,2,3,0,0,0],m = 3
nums2 = [2,5,6],n = 3

既然最后结果是将新的nums1排序,那么按照升序来排,两个数组中最大的一个值肯定在第m+n位。

第一步,分别获取nums1的第3位元素、nums2的第3位元素,比较两数大小,数值大的放在nums1的第6位,此时nums1变成了[1,2,3,0,0,6]。

第二步,分别获取nums1的第3位元素、nums2的第2位元素,比较两数大小,数值大的放在nums1的第5位,此时nums1变成了[1,2,3,0,5,6]。因为第一步是将nums2的元素移到了nums1,所以nums2向前移动一位,但是nums1的第3位并没有完全确定大小,所以保持不动。

第三步,分别获取nums1的第3位元素、nums2的第1位元素,比较两数大小,数值大的放在nums1的第4位,此时nums1变成了[1,2,3,3,5,6]。

第四步,分别获取nums1的第2位元素、nums2的第1位元素,比较两数大小,数值大的放在nums1的第3位,此时nums1变成了[1,2,2,3,5,6]。

依据上面的步骤,可以很快的写出代码,但是有种特殊情况要考虑,当nums1的最小值,也就是nums1的第一位元素,它比nums2的最大值都大的时候,nums2的元素是要全部移到nums1原元素的前面,此时在循环完后,就要加多一个判断,判断nums2的元素下标是否已经移动到了第一位。

public void merge2(int[] nums1, int m, int[] nums2, int n) {
    int i = m - 1;
    int j = n - 1;
    while (i >= 0 && j >= 0) {
        if (nums1[i] > nums2[j]) {
            nums1[i + j + 1] = nums1[i];
            i--;
        } else {
            nums1[i + j + 1] = nums2[j];
            j--;
        }
    }
    while (j >= 0) {
        nums1[i + j + 1] = nums2[j];
        j--;
    }
}

04 验证与测试

为了验证上面两种解法的正确性和效率,我们使用了一些数据来测试。

public static void main(String[] args) {
    Easy_088_MergeSortedArray instance = new Easy_088_MergeSortedArray();
    int[] nums1 = {1,2,2,3,4,5,0,0,0};
    int m = 6;
    int[] nums2 = {2,5,8};
    int n = 3;

    long start = System.nanoTime();
    instance.merge(nums1, m, nums2, n);
    long end = System.nanoTime();
    System.out.println("merge---输出:"+Arrays.toString(nums1)+" , 用时:"+(end-start)/1000+"微秒");

    int[] nums3 = {1,2,2,3,4,5,0,0,0};
    int m2 = 6;
    int[] nums4 = {2,5,8};
    int n2 = 3;
    long start2 = System.nanoTime();
    instance.merge2(nums3, m2, nums4, n2);
    long end2 = System.nanoTime();
    System.out.println("merge2---输出:"+Arrays.toString(nums1)+" , 用时:"+(end2-start2)/1000+"微秒");
}

测试结果如下

merge---输出:[1, 2, 2, 2, 3, 4, 5, 5, 8] , 用时:4微秒
merge2---输出:[1, 2, 2, 2, 3, 4, 5, 5, 8] , 用时:2微秒

从运行时间来看,解法二是明显优于解法一的,解法二的时间复杂度是O(n)。

05 小结

可能有人会想到借助Arrays.sort()方法来排序,但是如果是面试的时候,还是使用解法二好些。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

XGBoost的简单安装及入门使用 XGBoost安装及简单入门 XGBoost支持多种操作系统,如Windows, Linux, MacOS等,并支持多种语言版本,如Python, R, Scale, Java等。XGBoost的安装方式一般有两种,一种是直接通过pip安装(适合用于Python),另外一种是通过源码编译安装 1、通过pip安装 通过pip安装Python包既简单又方便,只需执行如下的命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xgboost 使用 阅读详情

相关推荐

Python+Appium实现泛微OA自动打卡:5分钟搭建移动端自动化脚本

移动端自动化测试是软件测试与办公自动化领域的重要技术方向,其核心原理是通过程序模拟用户对手机应用界面的操作,实现重复性任务的自动执行。Appium作为主流的开源移动端自动化框架,基于WebDriver协议,支持跨平台且无需修改被测应用,为自动化脚本开发提供了标准化接口。在工程实践中,结合Python简洁的语法和丰富的生态,可以快速构建稳定可靠的自动化解决方案。这一技术组合的价值在于能够高效处理“重复性、低价值、高频率”的日常操作,例如考勤打卡、数据填报等办公场景,显著提升工作效率。本文以泛微OA Emobi

weixin_28836875的博客 391

【LeetCode】33. Search in Rotated Sorted Array - Java实现

文章目录1. 题目描述:2. 思路分析:3. Java代码: 1. 题目描述: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]). You are giv...

小怪孩的成长之路 449

实验五 循环结构第1关:斐波那契数列第2关:统计一段英文语句中的单词数和句子数第3关:密码判断第4关:通过数列求自然常数e第5关:双倍余额递减法计算固定资产折旧第6关:销售统计第7关:投资年限计算

第1关:斐波那契数列第2关:统计一段英文语句中的单词数和句子数第3关:密码判断 第4关:通过数列求自然常数e 第5关:双倍余额递减法计算固定资产折旧

pro_daily的博客 8171

实验七:掌握基本的MapReduce编程方法 (JAVA+Python实现)(编程实现文件合并和去重操作,编写程序实现对输入文件的排序,对给定的表格进行信息挖掘)

一、实验目的: 1. 理解MapReduce的工作机制; 2. 掌握基本的MapReduce编程方法 3. 重点理解map过程,shuffle过程和reduce过程 二、实验环境: Hadoop+Eclipse+JDK 三、实验内容和要求: 1.编程实现文件合并和去重操作 对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文...

Weary_PJ的博客 1万+

基于 LSTM 的船舶轨迹预测,单步预测

基于 LSTM 的船舶轨迹预测,单步预测

fyuhao的博客 1万+

RK3588与银河麒麟V10 SP1 2403深度适配:国产化硬件与操作系统的完美融合

本文深入探讨了RK3588处理器与银河麒麟V10 SP1 2403操作系统的深度适配,展示了国产化硬件与操作系统的完美融合。通过性能验证和实际应用测试,证明了这套组合在多媒体处理、AI推理和日常办公中的卓越表现,实现了完全自主可控的计算平台。

weixin_29194255的博客 251

LeetCode第33题:Search in Rotated Sorted Array(Java详解)

Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]). You are given a ta...

WangHuanToBeBest 501

别再死磕RD算法了!用MATLAB手把手复现SAR后向投影(BP)成像(附完整代码与避坑点)

本文详细介绍了如何使用MATLAB实现合成孔径雷达(SAR)后向投影(BP)成像算法,突破传统RD算法在大斜视和复杂轨迹场景中的局限。通过完整的代码示例和避坑指南,帮助读者掌握BP算法的核心原理、内存优化策略和并行计算技巧,提升SAR成像精度与效率。

weixin_30908103的博客 299

编程题 | 合并两个有序数组

目录

遇卿 759

【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中)

你是否在全网苦寻【图像去噪(ImageDenoising)】的相关资料?你的目标是否是看懂【图像去噪(ImageDenoising)】的相关论文,复现代码,跑出结果,并试图创新?你是否需要发表【图像去噪(ImageDenoising)】的相关论文毕业?你是否需要做【图像去噪(ImageDenoising)】的相关项目,开发软件,研究算法,获得专利或者软著?只要是与【图像去噪(ImageDenoising)】有关的问题,那么请继续往下看。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

yolov5运行detect.py之后卡住了?没后续,没结果,没报错,怎么办?如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1106

java算法题两个数组合并_【leetcode刷题】[简单]88. 合并两个有序数组(merge sorted array)-java...

合并两个有序数组 merge sorted array题目给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,...

weixin_36450434的博客 197

YOLO系列算法改进 | C3k2改进篇 | 融合DEConv细节增强卷积模块 | 细节增强+多分支差分卷积融合,标准卷积的完美涨点替代! | TIP 2024

YOLO系列算法改进 | C3k2改进篇 | 融合DEConv细节增强卷积模块 | 细节增强+多分支差分卷积融合,标准卷积的完美涨点替代! | TIP 2024 (以YOLO26最新目标检测模型为基础,融合C3k2_DEConv创新模块进行改进)

2502_91881744的博客 311

【LeetCode】Merge Sorted Array

Merge Sorted Array Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume that A has enough space (size that is greater or equal tom+n)...

dashumao0228的博客 93

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

leetcode之Merge Sorted Array

将两个已经排好序的数组array1、array2再合并为一个排好序的数组,而且是放在array1里,所以循环的判断条件是array2的index不能为负(1)C语言实现void merge(int* nums1, int m, int* nums2, int n) {    int i=m-1,j=n-1,k=m+n-1;    while(j&gt;=0){        if(i&gt;=0&...

代码草根的专栏 340

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LeetCode-88. Merge Sorted Array [C++][Java]

You are given two integer arraysnums1andnums2, sorted innon-decreasing order, and two integersmandn, representing the number of elements innums1andnums2respectively. Mergenums1andnums2into a single array sorted innon-decreasing order.

贫道绝缘子的博客 200

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

(Java)leetcode-88 Merge Sorted Array

题目 【合并两个有序数组】 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...

不思量 281

【LeetCode-Java实现】88. Merge Sorted Array 合并两个有序数组

88. Merge Sorted Array合并两个有序数组题目描述思路实现 题目描述 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...

IT Crowd的博客 286

【Leetcode】 Merge Sorted Array

Leetcode(十二)

Wing_93的博客 344

LeetCode 88. Merge Sorted Array

LeetCode 88. Merge Sorted Array (Easy) 主要知识点:数组,倒序排列;优先级:3;

温迪今天刷题了吗 134

【力扣算法 LeetCode】88. Merge Sorted Array合并两个有序数组

文章目录前言一、题目二、解答1.代码2.复盘总结 前言 题目出自力扣 算法练习题:合并两个有序数组 一、题目 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表

南迁的博客 369

Leetcode Merge Sorted Array

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold addit

每天都要有进步 202

Leetcode 88. Merge Sorted Array (Java)

我会陆续更新leetcode题目的答案,语言主要选择的是java和python,答案为普通解法,时间和空间复杂度并非最佳,但愿意分享给大家,有更优解朋友,欢迎分享到评论区。谢谢。

weixin_58080442的博客 487

leetcode 29: Merge Sorted Array

Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume that A has enough space to hold additional elements from B. The number of elements initialized in A

西施豆腐渣 3416

LeetCode88 Merge Sorted Array

LeetCode88 Merge Sorted Array 问题来源LeetCode88 问题描述 Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: You may assume that nums1 has enough spa

yanqinghe123的专栏 217
上一篇: LeetCode算法题-Remove Duplicates from Sorted List
下一篇: LeetCode算法题-Same Tree(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值