二分查找总结
文章目录
- 二分查找总结
- 一、适用条件
- 二、方法类型
- 三、二分法的两种写法
- 3.1第一种写法“左闭右闭”
- 3.2第二种写法“左闭右开”
一、适用条件
二分查找适用条件为:
- 数组问题
- 有序且无重复元素的数组
如【LeetCode 704】:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
二、方法类型
二分查找法的思路主要是根据区间定义的“不变量”进行划分的。二分法中区间的定义主要有两种:
- 左闭右闭[left,right]
意思是target值在区间[left,right]中,那么left与right的关系是 “<=”
while(left<=right){
xxxx;
}
- 左闭右开[left,right)
意思是target值在区间[left,right)中,那么left与right的关系是“<”
while(left<right){
xxx;
}
三、二分法的两种写法
根据例题:
3.1第一种写法“左闭右闭”
int search(int* nums, int numsSize, int target){
//step1:写出临界条件变量:left,right
int left=0;
int right=numSize-1;
//------------------------
//step2:写出区间--左闭右闭;写出middle动态值
while(left<=right){
int middle=left+((right-left)/2);//数组取中间值赋给middle变量
//step3:根据条件移动middle值
if(nums[middle]>target){
//step4:往条件里补充条件(left,right指针如何动态移动?)
right=middle-1;
}else if(nums[middle<target]){
left=middle+1
}else{
return middle;//找到目标值target=middle
}
}
return -1;
}
3.2第二种写法“左闭右开”
int search(int* nums, int numsSize, int target){
//step1:写出临界条件变量:left,right
int left=0;
int right=numSize-1;
//------------------------
//step2:写出区间--左闭右闭;写出middle动态值
while(left<right){
int middle=left+((right-left)/2);//数组取中间值赋给middle变量
//step3:根据条件移动middle值
if(nums[middle]>target){
//step4:往条件里补充条件(left,right指针如何动态移动?)
right=middle;
}else if(nums[middle<target]){
left=middle+1
}else{
return middle;//找到目标值target=middle
}
}
return -1;
}
return middle;//找到目标值target=middle
}
}
return -1;
}