二分查找
二分查找
问题描述
给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1
样例输入
nums=[-1,0,3,5,9,12], target=9
样例输出
4
样例输入
nums=[-1,0,3,5,9,12], target=2
样例输出
-1
提示:
你可以假设nums中的所有元素是不重复的
n将在[1,10000]之间
nums的每个元素都将在[-9999,9999]之间
思路分析
既然给定数组已经升序的了,那么就可以用二分法查找
但是二分法这个算法存在局限性,即不能索引给定的有序数组的左右边界的值,具体分析请看这篇文章https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xiang-jie-by-labula/
代码实现
import java.util.Scanner;
public class BinarySearch {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
int target = scanner.nextInt();
System.out.println(binary_search(nums,target));
}
//二分查找
public static int binary_search(int[] nums,int target){
int left = 0;
int right = nums.length - 1;
while (left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] == target){
return mid;
}
else if (nums[mid] < target){
left = mid + 1;
}
else if (nums[mid] > target){
right = mid - 1;
}
}
return -1;
}
}
运行结果