题目
链接:https://leetcode-cn.com/problems/merge-sorted-array/
难度简单772
给你两个有序整数数组 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]
分析
- 合并两个有序数组,通过题目描述,正常思路考虑通过两个index标识,一个num1的index1,一个num2的index2,逐个元素比较,合并即可
- 但是第1点存在问题,当num2种的元素需要加入到num1时,num1中的元素,需要后移。频繁后移势必会带来更大的时间复杂度
- 因为num1可以容纳所有元素,考虑通过倒着比较可解决第一点问题,即,比较最大的元素,将最大的元素放在最后1位,倒数第二大的放在倒数第2位。
关键:比较最大的元素,而非比较最小的元素,更优
代码实现
package org.example;
import java.util.Arrays;
public class Leetcode88 {
public static void main(String[] args) {
Leetcode88 leetcode88 = new Leetcode88();
// int[] num1 = new int[]{1, 2, 3, 0, 0, 0};
// int[] num2 = new int[]{2, 5, 6};
// leetcode88.merge(num1, 3, num2, 3);
// System.out.println(Arrays.toString(num1));
int[] num1 = new int[]{2,0};
int[] num2 = new int[]{1};
leetcode88.merge(num1, 1, num2, 1);
System.out.println(Arrays.toString(num1));
}
public void merge(int[] nums1, int m, int[] nums2, int n) {
int lastIndex = m + n - 1;
while (n>0) {
if (m==0||nums1[m - 1] <= nums2[n - 1]){
nums1[lastIndex]=nums2[--n];
}else{
nums1[lastIndex]=nums1[--m];
}
lastIndex--;
}
}
}