二分查找
时间复杂度O(logn)
步骤:
- 从数组中间的元素开始,如果中间的元素正好是目标值,搜索结束
- 如果目标值大于或小于中间的元素,则在大于或小于中间的元素的那一半继续搜索
代码模版
//二分查找伪代码模版
while (left <= right) {
mid = (left + right) / 2;
if (array[mid] === target) return result;
else if (array[mid] < target) left = mid + 1;
else right = mid - 1;
}
例子: LC_0704
/*
给定一个n个元素有序的(升序)整型数组nums 和一个目标值target ,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。
* */
public class LC_0704 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int target = Integer.valueOf(sc.nextLine());
String[] str = sc.nextLine().trim().replace("[", "").replace("]", "").split(",");
int n = str.length;
int[] nums = new int[n];
for(int i = 0; i < n; i++){
nums[i] = Integer.valueOf(str[i]);
}
int res = search(nums, target);
System.out.print(res);
}
public static int search(int[] nums, int target){
int left = 0, right = nums.length-1;
while (left <= right){
int mid = left + ((right - left) >> 1);
if(nums[mid] == target) return mid;
if(nums[mid] < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return -1;
}
}
/*
eg:
9
[-1,0,3,5,9,12]
res:
4
2
[-1,0,3,5,9,12]
res:
-1
* */