目录
前言
本文主要介绍二分算法的思想和相关题目。很多介绍都说二分算法往往需要有序,但实际有序并不是使用二分算法的核心,使用二分算法的核心应该是两段性,也就是能根据题目条件把整个区间分为两段。
1、二分查找
链接:https://leetcode.cn/problems/binary-search/
本题是最基础的二分查找算法,之后的题目都是建立在本题的基础上:
a. 定义 left , right 指针,分别指向数组的左右区间。
b. 找到待查找区间的中间点 mid ,找到之后分三种情况讨论:
- i. arr[mid] == target 说明正好找到,返回 mid 的值;
- ii. arr[mid] > target 说明 [mid, right] 这段区间都是⼤于 target 的,因此舍去右边区间,在左边 [left, mid -1] 的区间继续查找,即让 right = mid -1 ,然后重复 2 过程;
- iii. arr[mid] < target 说明 [left, mid] 这段区间的值都是⼩于 target 的,因此舍去左边区间,在右边 [mid + 1, right] 区间继续查找,即让 left = mid +1 ,然后重复 2 过程;
c. 当 left 与 right 错开时,说明整个区间都没有这个数,返回 -1 。
class Solution {
public int search(int[] nums, int target) {
int left=0,right=nums.length-1;
while(left<=right){
int mid=left+(right-left)/2;//防止溢出
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
left=mid+1;
}else{
right=mid-1;
}
}
return -1;
}
}