合并两个有序数组(java解)

在日常开发中,我们经常需要将两个已经排好序的数组合并为一个新的有序数组。虽然可以将两个数组直接合并后再排序,但这样效率不高。本文将介绍一种 高效的 Java 解法,利用 双指针和从后向前填充 的策略,原地将两个有序数组合并为一个有序数组,无需额外空间。通过详细示例和代码讲解,读者可以轻松掌握这种在数组处理中非常实用的技巧。
1
题目介绍

给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 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:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。
示例 3:
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
2
题目解释

这道题我一开始想了两种解题思路
第一种是 先把两个数组合并 然后按照冒泡排序 但是考虑了一下如果是实际使用场景 那么000不一定在数组末尾
第二种是判断是否为0 然后进行替换和排序操作 但是使用场景中也不一定证明0就是空的数值 所以如果是实际应用应该大家进行判断决定用那种方式
3
方法1

import java.util.Arrays;
class Solution {
/**
* 合并两个有序数组 nums1 和 nums2 到 nums1 中。
* nums1 有足够空间(长度 m+n),其中前 m 个元素是有效数字,nums2 有 n 个元素。
* 最终结果要求 nums1 成为一个有序数组。
*/
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 1. 把 nums2 的所有元素直接放到 nums1 的尾部(从下标 m 开始)
for (int i = 0; i < n; i++) {
nums1[m + i] = nums2[i];
}
// 2. 使用冒泡排序对 nums1 进行整体排序
for (int i = 0; i < nums1.length - 1; i++) {
// 每一轮冒泡,将最大值“冒泡”到末尾
for (int j = 0; j < nums1.length - 1 - i; j++) {
if (nums1[j] > nums1[j + 1]) {
// 交换相邻元素
int temp = nums1[j];
nums1[j] = nums1[j + 1];
nums1[j + 1] = temp;
}
}
}
}
}
4
方法2

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// p1 指向 nums1 已有元素的最后一个位置
int p1 = m - 1;
// p2 指向 nums2 的最后一个元素
int p2 = n - 1;
// p 指向 nums1 最终合并后数组的最后一个位置
int p = m + n - 1;
// 从后向前遍历,直到 nums2 中的元素都处理完
while (p2 >= 0) {
// 如果 nums1 还有元素且当前元素大于 nums2 的当前元素
if (p1 >= 0 && nums1[p1] > nums2[p2]) {
// 将 nums1 的当前元素放到 nums1 的末尾
nums1[p--] = nums1[p1--];
} else {
// 否则,将 nums2 的当前元素放到 nums1 的末尾
nums1[p--] = nums2[p2--];
}
}
// 循环结束后,nums1 中已经是合并后的有序数组
}
}
5
完结

如果大家还有什么更好的办法可以打在评论区哦








更多相关项目
猜你喜欢
评论/提问(已发布 0 条)

