二分查找
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
样例
样例 1:
输入:[1,4,4,5,7,7,8,9,9,10],1
输出: 0
样例解释:
第一次出现在第0个位置。
样例 2:
输入: [1, 2, 3, 3, 4, 5, 10],3
输出: 2
样例解释:
第一次出现在第2个位置
样例 3:
输入: [1, 2, 3, 3, 4, 5, 10],6
输出: -1
样例解释:
没有出现过6, 返回-1
算法实现
基本二分查找法
- 判断数组是否为空,为空直接返回-1。
- 定义start,end,并且初始化。
- 二分查找,关键start+1<end循环结束条件。
- 循环结束,单独判断start和end位置的值。
package com.company;
public class BinarySearch {
public static int binarySearch(int[] nums, int target) {
// write your code here
//1. 判断数组是否为空,为空直接返回-1。
if (nums==null||nums.length == 0 ) {
return -1;
}
//2. 定义start,end,并且初始化。
int start = 0;
int end = nums.length-1;
//3. 二分查找,关键start+1<end循环结束条件。
while(start+1<end){
int mid = start+(end-start)/2;
if (nums[mid] == target) {
return mid;
}else if(nums[mid]<target){
start = mid;
}else{
end = mid;
}
}
//4. 循环结束,单独判断start和end位置的值。
if(nums[start]==target){
return start;
}
if(nums[end]==target){
return end;
}
return -1;
}
public static void main(String[] args) {
// write your code here
int[] array = new int[]{1,4,4,5,7,7,8,9,9,10};
int result = binarySearch(array,4);
System.out.println(result);
}
}
输出结果: