题目来源
初始思路:同时循环遍历两个数组,选出较小元素放入新数组。剩下一个没有被遍历完的数组的剩余元素直接拼接到新数组后。
错误示例:
var merge = function (nums1, m, nums2, n) {
let i = 0,
j = 0,
nums3 = [];
while (i < m && j < n) {
if (nums1[i] <= nums2[j]) {
nums3.push(nums1[i++]);
} else {
nums3.push(nums2[j++]);
}
}
if (i < m) {
nums3 = nums3.concat(nums1.slice(i, m));
}
if (j < n) {
nums3 = nums3.concat(nums2.slice(j, n));
}
nums1 = nums3;
};
nums1 = nums3
不会改变原数组,这样做只是改变了参数nums1指向了nums3的内容,但是原nums1内容并没有改变。
正确示例1:
var merge = function (nums1, m, nums2, n) {
let i = 0,
j = 0,
nums3 = [];
while (i < m && j < n) {
if (nums1[i] <= nums2[j]) {
nums3.push(nums1[i++]);
} else {
nums3.push(nums2[j++]);
}
}
if (i < m) {
nums3 = nums3.concat(nums1.slice(i, m));
}
if (j < n) {
nums3 = nums3.concat(nums2.slice(j, n));
}
for (let i = 0; i < nums1.length; i++) {
nums1[i] = nums3[i];
}
//nums1.splice(0, nums1.length, ...nums3);
};
直接改变nums1对应的区域的值。
注意使用splice
方法会有一定的空间损耗。
时间复杂度: O ( m + n ) O(m+n) O(m+n)。
空间复杂度: O ( m + n ) O(m+n) O(m+n)。
正确示例1可以优化的地方:辅助数组nums3可以不用,我们从后往前遍历,依次选择较大的填入nums1。
正确示例2:省去nums3
数组
var merge = function(nums1, m, nums2, n){
let i = m - 1, j = n - 1, k = m + n - 1;
while(i>=0&&j>=0){
if(nums1[i]>nums2[j]){
nums1[k--]=nums1[i--];
}else{
nums1[k--]=nums2[j--];
}
}
while(j>=0){
nums1[k--]=nums2[j--];
}
// nums1.splice(0,j+1,...nums2.slice(0,j+1));
}
时间复杂度: O ( m + n ) O(m+n) O(m+n)
空间复杂度: O ( 1 ) O(1) O(1)
小伙伴们有更好的解法吗?