LeetCode 88. 合并两个有序数组
先合并再排序,没什么可说的,快排:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2,0,nums1,m,n);
Arrays.sort(nums1);
}
}
或者
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);
}
}
时间复杂度:O((m+n)log(m+n))
空间复杂度:O(1)
然而看到题目直接想到的就是合并同时排序,既节约空间,也节约时间。但是会有很多次移动,翻了题解,得到了第二种方式,归并排序-倒序!目前发现的最优解:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
}
时间复杂度:O(m+n)
指针移动单调递减,最多移动 m+n 次。
空间复杂度:O(1)。原地修改,不需要额外空间。
代码来源:
https://leetcode-cn.com/problems/merge-sorted-array/solution/gong-shui-san-xie-yi-ti-san-jie-shuang-z-47gj/
https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetco-rrb0/