Problem: 35. 搜索插入位置
思路
通过指针查找并且对比与 target 的大小来确认下一步指针转向的操作
解题方法
二分法( O ( l o g N ) O(logN) O(logN))相比较于逐位查找( O ( n ) O(n) O(n))来说时间复杂度较低,更快速。
设定快慢指针 slow fast,并且设定 mid 为中间指针。
循环条件设置为 slow < fast
跳出循环的条件为 nums[mid] === target 或者 falst - slow === 1
nums[mid] === target 时候 mid 位置即为 target 位置
falst - slow === 1 时候证明 target 在 快慢指针中间。
复杂度
时间复杂度:
添加时间复杂度, 示例: O ( l o g N ) O(logN) O(logN)
空间复杂度:
添加空间复杂度, 示例: O ( 1 ) O(1) O(1)
code
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
// 二分法
var searchInsert = function(nums, target) {
const len = nums.length
let slow = 0,fast = len - 1
if (nums[fast] < target) return fast + 1
if (nums[slow] > target) return slow
while (slow < fast) {
let mid = Math.floor((slow + fast) / 2)
if (nums[mid] === target) {
return mid
}
if (fast - slow === 1) return fast
if (nums[mid] > target) {
fast = mid
} else if (nums[mid] < target) {
slow = mid
}
}
return slow
};
补充双指针法
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
// 双指针法
var searchInsert = function(nums, target) {
const len = nums.length
let fast = len-1,slow = 0
while (fast >= slow) {
if (nums[fast] === target) return fast
if (nums[slow] === target) return slow
if (nums[fast] < target) return fast + 1
if (nums[slow] > target) return slow
if (nums[fast] > target && nums[slow] < target) {
fast --
slow ++
}
}
return slow
};