每天进步一点点
打算有来一次跟着三叶姐 刷穿leetCode 算法开始第二天 合并两个有序数组 难度
easy
合并两个有序数组
题目描述
给你两个有序整数数组
nums1和nums2, 请你将nums2合并到nums1中, 使nums1成为一个有序数组 nums1 有效的个数 m, nums2.length = n 且 nums1.length >= (m + n)示例: 输入:
nums1 = [1,2,3,0,0,0] m = 3nums2 = [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!!!坚持