基本思路:对于给定升序且无重复数组区间,采用二分查找,通过与中位数对比而逐渐缩小区间范围,如果找到直接返回。若未找到,循环条件不满足,退出循环直接返回-1
需要注意的点:
- 循环条件用<=(左闭右闭)还是<(左闭右开)
- 左右边界赋值
方法一:区间采用左闭右闭原则
- 区间判断为left<=right
- 此时右区间点有效,赋值时为middle-1
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
int middle ;
while(left<=right){
middle = (left+right)/2;
if(nums[middle]>target){
right = middle-1;
}else if(nums[middle]<target){
left = middle+1;
}else{
return middle;
}
}
return -1;
}
}
方法二:区间采用左闭右开原则。
道理如上,只需将右区间点赋值为middle,修改循环的判别条件为left<right即可。
错误思路
- 为新划分的区间开辟新内存,赋值给数组——浪费内存,且不好计算下标位置
- 由于新开辟内存,出现在未赋值数组查找元素的情况
- 由于下标位置是计算的,出现了数组下标越界
- 对区间划分不清晰,导致跳出循环条件有误,造成答案错误输出
参考答案经验:
- 在代码中,大概率会出现的条件判断应该放在前,节省时间。针对本题而言,直接判断相等的情况就会比较少,应该放后面
- 多用已知变量判断,重复调用计算数组长度,会比较浪费时间