1. 概述
本文主要描述二分法与排序数组的基本思想,常见题型以及思考过程。
2. 基本思想
二分法的主要思想就是每次保留有解的一部分,舍弃掉肯定不包含答案的另一部分。
一般在题目中,如果让你找第一个或者最后一个满足条件的位置或者值,可以考虑用二分法。
二分法的内涵是,逐步缩小解的范围,在得到一个最小范围后,通过枚举的方法来得到最终的答案。
这里强调的是通过二分法我实际是需要得到一个解的范围,而不是一个具体解。
这样有助我们在临界位置进行处理,算法显得更好理解,也排除了大家在临界位置上的纠结。
3. 基本模板
/*模板函数:
*给定排序数组nums(从小到大排列),在nums中寻址target
*/
public int findPosition(int[] nums, int target) {
/*入参判断*/
if(nums == NULL || 0 == nums.length) {
return -1;
}
/*指定2个标记start 和end ,start初始指向数组第一个元素,end初始指向数组最后一个元素*/
int start = 0;
int end = nums.length -1;
while(start+1 < end) { /*这样写永远不会错*/
int mid = start+(end-start)/2; /*避免overflow*/
if(nums[mid] == target) { /*表示找到了*/
return mid;
}else if(nums[mid] < target) { /*表示target在mid到end之间,那么我们需要把start指向到mid*/
start = mid;
}else { /*表示target在start到mid之间,那么我们需要把end指向到mid*/
end = mid;
}
/*如果还没有找到target,那么现在就剩下start和end了,枚举他们是否等于target*/
if(nums[start] == target) {
return start;
}
if(nums[end] == target) {
return end;
}
/*还没找到,那就是真的没了*/
return -1;
}
}