排序算法

146 阅读1分钟

合并两个有序数组

方式一: 双指针 (从前到后)+ 拷贝

  • 时间复杂度:O(m+n)
  • 空间复杂度:O(m+n)
var merge = function(nums1, m, nums2, n) {
    // 双指针  + 拷贝空间  
    //1. 构造temp: 是nums1 和nums2 的所有数据
    let temp = [...nums1];
    for(let i = 0; i< n;i++){
        temp[i+m] = nums2[i]
    }
   
    let p = 0;
    let i = 0; 
    let j = m;
    // while(p< m+n) 是一样的
    while(p<nums1.length){
        if(i == m){
      //一定要先放在第一个,因为nums1遍历完成后,i就一直等于m,直接把nums2的值拷贝过去即可
            nums1[p] = temp[j++]
        }else if(j == m+n){
            nums1[p] = temp[i++]
        }else if(temp[i] <= temp[j]){
            nums1[p] = temp[i];
            i++;
        }else if(temp[i]>temp[j]){
            nums1[p] = temp[j++]
        }
         
        p++;
    }
    return nums1;

};

方式二(优化):逆向双指针 ⭐️⭐️

  • 时间复杂度:O(m+n)
  • 空间复杂度:O(1)
var merge = function(nums1, m, nums2, n) {
    // 从后向前 
    let i = m-1; 
    let j = n-1;
    let p = (m+n)-1;
    while(i>=0 && j>=0){
        if(nums1[i] < nums2[j]){
            nums1[p] = nums2[j];
            j--;
        }else if(nums1[i] >= nums2[j]){
            nums1[p] = nums1[i];
            i--;
        }

        p--;
    }
    // nums1 不用动
    while(j>=0){ // nums2还有
        nums1[p] = nums2[j];
        j--;
        p--;
    }
};