力扣Java - 88. 合并两个有序数组
合并两个有序数组
- 题目描述
- 示例演示
-
-
-
- 示例一
- 示例二
- 示例三
-
-
- 算法思想
- 算法代码
题目描述
- 两个按非递减顺序排列的整数数组 nums1 和 nums2。
- nums1 数组元素个数 m 个;nums2 数组元素个数 n 个。
- 要求:合并 nums2 到 nums1 中,使合并后的数组按非递减顺序排列。
- 非递减顺序:整体呈现递增趋势,但是允许存在数值相等的元素,并不是严格递增。
注意:
- 合并后数组不应由函数返回,而是存储在数组 nums1 中。
- nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例演示
示例一
输入: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 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果: [1] 。
示例三
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果: [1] 。
注意:因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
算法思想
- 我是借助了一个临时的int型数组temp,该数组的长度为 m + n。
- 使用while循环遍历数组。第一个while循环是用来挨个比较 nums1 数组和 nums2 数组元素的大小,将较小者存储到 temp 数组中,同时对下标执行自增操作。
- 当第一个while循环的条件不满足时,说明 nums1 和 nums2 数组中有一个数组的元素已经全部存储在了 temp 数组中了,无需再进行两个数组元素的比较工作。
- 第2个和第3个 while 循环只能执行一个,将数组中剩余元素依次添加到 temp 数组中。
- 当全部执行完毕后,使用 for 循环将 temp 数组中的元素赋值到 nums1 数组中,因为题目要求存储到 nums1 数组。
算法代码
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int[] temp = new int[m+n]; int i = 0, j = 0, k = 0; while( i < m && j < n){ if( nums1[i] < nums2[j] ){ temp[k++] = nums1[i++]; }else{ temp[k++] = nums2[j++]; } } while( i < m ){ temp[k++] = nums1[i++]; } while( j < n ){ temp[k++] = nums2[j++]; } for (int x = 0; x < temp.length; x++){ nums1[x] = temp[x]; } }}
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖