【Java】高效解决 非降序数组合并 两种方法

2024-05-11 18:36

本文主要是介绍【Java】高效解决 非降序数组合并 两种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

 oj:https://leetcode.cn/problems/merge-sorted-array/submissions/

合并两个有序数组是个经典问题,它不仅在算法学习中频繁出现,也在实际开发中经常遇到。合并数组是一个基础而重要的操作。在Java中,我们有一些方法可以解决这个问题,每种方法都有其独特的优势和适用场景。

首先是第一种,先将两个有序数组合并到nums1中,接着调用Array.sort()方法进行排序,这种方法简单易懂,很容易想到。

 public void merge1(int[] nums1, int m, int[] nums2, int n) {for (int i = 0; i < n; i++) {nums1[m+i] = nums2[i];}Arrays.sort(nums1);}public static void main1(String[] args) {int m = 5;int n = 5;int[] nums1 = {1,2,4,6,7,0,0,0,0,0};int[] nums2 = {1,2,2,4,8};Test test = new Test();test.merge1(nums1,m,nums2,n);System.out.println(Arrays.toString(nums1));}

第二种,使用双指针思想,从末尾开始同时对比nums1与nums2,将较大值放入nums1的末尾,同时对应数组长度-- ,来达到排序的目的。

public void merge2(int[] nums1, int m, int[] nums2, int n) {// 从两个数组的末尾开始比较和合并元素,直到其中一个数组遍历完毕while (m > 0 && n > 0) {// 如果nums2的当前元素大于nums1的当前元素,//则将nums2的当前元素放入nums1的末尾if (nums2[n - 1] > nums1[m - 1]) {nums1[m + n - 1] = nums2[n - 1];n--; // 移动nums2指针向前一位} else {// 否则将nums1的当前元素放入nums1的末尾nums1[m + n - 1] = nums1[m - 1];m--; // 移动nums1指针向前一位}}// 如果nums2中还有剩余元素,将其逐个放入nums1的前面while (n > 0) {nums1[n - 1] = nums2[n - 1];n--;}
}public static void main(String[] args) {int m = 5;int n = 5;int[] nums1 = {1, 2, 4, 6, 7, 0, 0, 0, 0, 0};int[] nums2 = {1, 2, 2, 4, 8}; Test test = new Test(); test.merge2(nums1, m, nums2, n);System.out.println(Arrays.toString(nums1));
}

以上就是该问题的两种解决思想;


希望这篇博客能为你理解java编程思想提供一些帮助。

如有不足之处请多多指出。

我是高耳机。 

这篇关于【Java】高效解决 非降序数组合并 两种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980334

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF