题目大意
合并两个已经有序的数组,结果放在第一个数组中,第一个数组假设空间足够大。要求算法时间复杂度足够低。
解题思路
1.可以先吧nums2的数据全放在nums1 里面,然后再对nums1进行排序,时间复杂度O((m + n)log(m+n))
2.可以复制一份nums1的前m个数,然后从前往后依次对比nums1,nums2,时间复杂度O(m+n),空间复杂度O(m)
3.为了不大量移动元素,就要从2个数组长度之和的最后一个位置开始,依次选取两个数组中大的数,从第一个数组的尾巴开始往头放,只要循环一次以后,就生成了合并以后的数组了。时间复杂度O(m+n)
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1;
int j = n - 1;
int index = m + n - 1;
while (i > -1 || j > -1) {
if (i > -1 && j > -1) {
if (nums1[i] > nums2[j]){
nums1[index] = nums1[i];
i--;
} else {
nums1[index] = nums2[j];
j--;
}
} else if (i > -1) {
nums1[index] = nums1[i];
i--;
} else {
nums1[index] = nums2[j];
j--;
}
index--;
}
}