合并两个有序数组
题目描述
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
题目来源
力扣LeetCode) https://leetcode-cn.com/leetbook/read/top-interview-questions/xmi2l7/
思路解析(渣渣。。。)
类似直接插入排序。遍历第二个数组,然后比较移位
/**
* @author HelloWorld
* @create 2021-04-16-21:31
* @email 154803771@qq.com
*/
public class LeedCode {
/**
* 合并两个有序数组
*/
public static void main(String[] args) {
int[] nums1 = {1, 2, 3, 0, 0, 0};
int[] nums2 = {0, 5, 6};
int m = 3, n = 3;
merge(nums1, m, nums2, n);
for (int data : nums1){
System.out.println(data);
}
}
public static void merge(int[] nums1, int m, int[] nums2, int n) {
for (int j = 0; j < n; j++) {
int i = m - 1;
boolean flag = true;
while (i >= 0 && nums2[j] < nums1[i]) {
nums1[i + 1] = nums1[i];
nums1[i] = nums2[j];
i--;
flag = false;
}
if (flag) {
nums1[i + 1] = nums2[j];
}
m++;
}
}
}
站在巨人肩膀上的发现
因为都是有序的,所以完全可以都从两个数组的最右边开始比较,它们中较大的,当然也要位于nums1的最右边。。。
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1;
int j = n - 1;
int end = nums1.length - 1;
while (j >= 0) {
if (i >= 0 && nums1[i] > nums2[j]){
nums1[end] = nums1[i];
i--;
} else{
nums1[end] = nums2[j];
j--;
}
end--;
}