88. 合并两个有序数组
难度简单1612
给你两个按 非递减顺序 排列的整数数组 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 中。
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109
进阶:你可以设计实现一个时间复杂度为 O(m + n)
的算法解决此问题吗?
通过次数776,559提交次数1,482,880
心路历程,我真的服了呀,我想的是,直接排序,但是发现挺不好弄的,之后想到为什么我不直接先把nums2中的数插入到nums1去,之后再排序不就可以了吗?
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] sum;
for(int i = 0;i<m+n;i++){
if(nums1[i]<nums2[0]){
nums1[i+1]=nums2[0];
}
}
}
}
改进版
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int sum =0;
for(int i=m;i<n+m;i++){
nums1[i] = nums2[sum];
sum++;
}
Arrays.sort(nums1);
}
}
但是效果还是不是很好
改进版2.0
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i=0;i<n;i++){
nums1[m+i] = nums2[i];
}
Arrays.sort(nums1);
}
}
之后,稍稍给了一下,根本不需要什么sum存,直接把nums1的基准提到m就可以了。
之后,做了一下参考发现还是可以降低时间复杂度的,改成O(M+N)类型的,如何呢
其实就是构造一个temp数组相当于寄存一下,还是很好的,之后比对的问题,如何解决呢?
就是利用我们的单独下标定义,比如nums1index和nums2index,进行比较,之后把temp数组中的值再给nums1.
改进版3.0
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int k = m+n;
int[] temp = new int[k];
for(int index = 0,nums1index = 0,nums2index = 0;index < k;index++){
if(nums1index >= m){
temp[index] = nums2[nums2index++];
}else if(nums2index >= n){
temp[index] = nums1[nums1index++];
}else if(nums1[nums1index] < nums2[nums2index]){
temp[index] = nums1[nums1index++];
}else{
temp[index] = nums2[nums2index++];
}
}
for(int i = 0;i<k;i++){
nums1[i] = temp[i];
}
}
}
这样看来就会好很多了。