代码随想录算法训练营第一天 | 二分查找、移除元素

172 阅读1分钟

二分查找

题目链接:二分查找

  • 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
};