二分查找
主要思想
前提:线性表中的记录必须是关键码有序,而且是从小到大,线性表必须采取顺序存储
折半查找的主要思想是:在有序表中,取中间值作为比较对象,若给定值与中间记录的关键字相等,则查找成功,若给定的值小于中间记录的关键字,则在中间记录的左半区继续查找,否则在右半区继续查找,若所有区域没有记录,则查找失败。
代码
class Solution {
/**
* @param nums: The integer array.
* @param target: Target to find.
* @return: The first position of target. Position starts from 0.
*/
public int binarySearch(int[] nums, int target) {
if(num == null || num.length == 0){
return -1;
}
int start = 0;
int end = nums.length - 1;
while(start <= end){
int middle = start + (end - start) / 2
//int middle = (start + end) / 2;
if(target < nums[middle]){
end = middle - 1;
}else if(target > nums[middle]){
start = middle + 1;
}else{
return middle;
}
}
return -1;
}
}
进阶
返回第一次出现的下标
class Solution {
/**
* @param nums: The integer array.
* @param target: Target to find.
* @return: The first position of target. Position starts from 0.
*/
public int binarySearch(int[] nums, int target) {
if(nums == null || nums.length == 0){
return -1;
}
int result = -1;
int start = 0;
int end = nums.length - 1;
while(start <= end){
int middle = start + (end - start) / 2;
if(target == nums[middle]){
result = middle;
end = middle -1;
}else if(target > nums[middle]){
start = middle + 1;
}else{
end = middle - 1;;
}
}
return result;
}
}