Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

算法【二分搜索篇】 #7

Open
SampsonKY opened this issue Oct 1, 2020 · 0 comments
Open

算法【二分搜索篇】 #7

SampsonKY opened this issue Oct 1, 2020 · 0 comments
Assignees
Labels
每日一题 算法 Extra attention is needed

Comments

@SampsonKY
Copy link
Owner

二分搜索框架

function binarySearch(nums, target){
    let left = 0, right = nums.length-1
    // 区间 [left, right]
    while(left<=right){
        let mid = left + (right - left)/2
        if(nums[mid] === target){
            ...
        } else if(nums[mid] < target){
            left = ...
        } else if(nums[mid] > target){
            right ...
        }
    }
    return ...
}
  • 代码中 left + (right - left) / 2 就和 (left + right) / 2 的结果相同,但是有效防止了 leftright 太大直接相加导致溢出。
  • 建议使用 else if 把所有情况写清楚

寻找一个数

function binarySearch(nums, target){
    let left = 0, right = nums.length-1
    while(left<=right){
        let mid = left + Math.floor((right + left)/2)
        if(nums[mid] === target){
            return mid
        } else if(nums[mid] < target){
            left = mid+1
        } else if(nums[mid] > target){
            right = mid-1
        }
    }
    return -1
}

寻找左侧边界的二分搜索

示例:

输入:
[1,2,2,2,3] 2
输出:1

代码:

function left_bound(nums, target){
	let left = 0, right = nums.length-1
    // 搜索区间 [left, right]
    while(left<=right){
        let mid = Math.floor((right + left)/2)
        // 收缩右边界
        if(nums[mid] === target){
            right = mid-1
        } else if(nums[mid] < target){
            left = mid+1 //搜索区间 [mid+1, right]
        } else if(nums[mid] > target){
            right = mid-1 //搜索区间 [left, mid-1]
        }
    }
	if(left >= nums.length || nums[left] !== target) return -1
    return left
}

寻找右侧边界的二分搜索

示例:

输入:
[1,2,2,2,3] 2
输出:3

代码:

function left_bound(nums, target){
	let left = 0, right = nums.length-1
    // 搜索区间 [left, right]
    while(left<=right){
        let mid = Math.floor((right + left)/2)
        // 收缩左边界
        if(nums[mid] === target){
            left = mid+1
        } else if(nums[mid] < target){
            left = mid+1 //搜索区间 [mid+1, right]
        } else if(nums[mid] > target){
            right = mid-1 //搜索区间 [left, mid-1]
        }
    }
    // 检查right越界的情况
	if(right<0 || nums[right] !== target) return -1
    return right
}

leetcode 题目

@SampsonKY SampsonKY added 算法 Extra attention is needed 每日一题 labels Oct 1, 2020
@SampsonKY SampsonKY self-assigned this Oct 1, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
每日一题 算法 Extra attention is needed
Projects
None yet
Development

No branches or pull requests

1 participant