二分查找
题目链接:二分查找
- 2种思路:左闭右必,即left <= right,此时right包含在nums数组中,故right = nums.length - 1; 左闭右开,即left < right,此时right不包含在nums数组中, 故right = nums.length
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
var search = function(nums, target) {
// 左闭右闭
let left = 0, right = nums.length - 1
while(left <= right) {
let mid = Math.floor((left + right) / 2)
if(nums[mid] > target) {
right = mid - 1
} else if(nums[mid] < target) {
left = mid + 1
} else {
return mid
}
}
return -1
};
var search = function(nums, target) {
// 左闭右开
let left = 0, right = nums.length
while(left < right) {
let mid = Math.floor((left + right) / 2)
if(nums[mid] > target) {
right = mid
} else if(nums[mid] < target) {
left = mid + 1
} else {
return mid
}
}
return -1
};
移除元素
题目链接:移除元素
- 思路:题目描述要求在原数组上修改,故想到快慢指针,让fast指针遍历,然后赋值给slow指针
- 时间复杂度:O(n)
- 空间复杂度:O(1)
var removeElement = function(nums, val) {
let fast = 0, slow = 0
for(; fast < nums.length; fast++) {
if(nums[fast] !== val) {
nums[slow] = nums[fast]
slow++
}
}
return slow
};