打怪升级之旅第二天(1)

51 阅读1分钟

每天进步一点点

打算有来一次跟着三叶姐 刷穿leetCode 算法开始第二天 合并两个有序数组 难度 easy

合并两个有序数组

题目描述

给你两个有序整数数组 nums1nums2, 请你将nums2合并到 nums1中, 使nums1成为一个有序数组 nums1 有效的个数 m, nums2.length = n 且 nums1.length >= (m + n)

示例: 输入: nums1 = [1,2,3,0,0,0] m = 3 nums2 = [2,5,6] n = 3 返回 [1,2,2,3,5,6]

思路分析

可以使用双指针法


/**
 * 
 * @param {number[]} nums1 
 * @param {number} m 
 * @param {number[]} nums2 
 * @param {number} n 
 * 时间复杂度:T(n) = 8m + 12n + 3 -> O(m+n)
 * 空间复杂度: i,j,k 不会随着输入而改变 -> O(1)
 */
const merge = function(nums1, m, nums2,n){
  let i = m - 1 // 最坏执行的次数: 1
  let j = n - 1 // 最坏执行的次数: 1
  let k = m + n - 1 // 最坏执行的次数: 1
  while(i >= 0 && j >= 0){  // 最坏的执行次数 m+n
    if(nums1[i] >= nums2[j]){  // 最坏的执行次数 m+n
      nums1[k] = nums1[i]  // 最坏的执行次数 m+n
      i--  // 最坏的执行次数 m+n
      k-- // 最坏的执行次数 m+n
    }else{
      nums1[k] = nums2[j]  // 最坏的执行次数 m+n
      j--  // 最坏的执行次数 m+n
      k--  // 最坏的执行次数 m+n
    }
  }
  while(j >= 0){ // 最坏的执行次数 n
    nums1[k] = nums2[j]  // 最坏的执行次数 n
    k-- // 最坏的执行次数 n
    j-- // 最坏的执行次数 n
  }
}
console.time('merge')
let nums1 = [1,2,3,0,0,0]
merge(nums1,3,[2,5,6], 3)
console.timeEnd('merge') // 0.083ms
console.log('result', nums1) // [ 1, 2, 2, 3, 5, 6 ]

Baybay!!!坚持