【Java基础题型】力扣88、合并两个有序数组

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

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

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


示例 1:

复制代码
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

**示例 2:**略

示例 3:

复制代码
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

、解法:下面代码采用的是双指针,初始化的时候nums1前半部分是正常要合并的数据,后半部分是预留的位置(占位用的0),按照非递减顺序****(升序),大的排在右边。(理清题干要求)

使用双指针i 、j,分别为从m+n-1和,n-1,m-1开始。(i)其中m+n是数组nums1的长度,比如int array7,m+n-1=6(尾部指针从哪儿开始数),数组长度为m+n=7,有7个元素。

(j)其中n代表数组nums2的数组长度、元素个数。

(k)k代表nums1的有效数据部分的个数-1,m-1,就是它有效数据是从哪儿开始数下标的;

nums1 = 1,2,3,0,0,0,那这里m-1就是2,nums12=3,nums11=2,nums10=1;

关键比较的数组的思路:

if( nums1i****> nums2j****) 这里比较数组1和数组2,谁大谁小,

大的数据放到数组1即nums1的末尾,依次递减。

nums1 = 1,2,3,0,0,0, m = 3, nums2 = 2,5,6,

合并结果是 ***1*** ,***2*** ,2,***3***,5,6

java 复制代码
public class 合并数组1 {
		public void merge(int[] nums1,int m,int[] nums2,int n) {

			int i=m-1;
			int j=n-1;
			int k=m+n-1;
			
			while(i>=0 && j>=0) {				
				if(nums1[i]>nums2[j]) {			//如果数组1大于数组2,录入数组1左边的
					nums1[k--]=nums1[i--];		//k是占0的空位置喔
				}else {
					nums1[k--]=nums2[j--];
				}
				
				while(j>=0) {
					nums1[k--]=nums2[j--];
				}
			}
		}
}

使用了双指针的方法来合并两个有序数组。这里有几个关键的步骤:

  1. 初始化三个指针i,j和k,分别指向nums1的有效元素的末尾、nums2的末尾和合并后的数组的末尾。

  2. 从nums1和nums2的末尾开始遍历,选取较大的元素 放入合并后的数组的末尾,并将相应指针向前移动一位。

  3. 将剩余的nums2的元素放入合并后的数组的相应位置。

相关推荐
j7~2 分钟前
【数据结构初阶】队列的实现(链式队列 + 循环队列)--详解
c语言·开发语言·数据结构·学习·队列·queue·c\c++
道影子15 分钟前
《道德经》031兵者不祥,胜以丧礼处之
人工智能·深度学习·算法
花生了什么事o19 分钟前
分布式 ID 生成方案:从数据库自增到雪花算法
数据库·分布式·算法
king_linlin20 分钟前
算法基础——算法复杂度
c语言·开发语言·数据结构·算法
king_linlin1 小时前
数据结构——顺序表(附图文讲解|超详细)
c语言·数据结构·算法
GAOJ_K1 小时前
老旧产线弧形导轨换新:同规格替换避坑选型思路
人工智能·算法·机器学习·制造·导轨偏磨
Jerry6 小时前
LeetCode 189. 轮转数组
算法
Jerry7 小时前
LeetCode 739. 每日温度
算法
2601_9545267511 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
叩码以求索12 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展