问题描述:给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
样例:在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
分析:二分查找,又叫折半查找,,是一种高效率的查找方式,查找的前提是被查找的数据必须是有序的。二分查找的思想是找到查找区间[i,j]的中点位置mid,比较mid位置上的值与target的大小,根据大小在调整查找区间,这样不断地缩小查找范围,直至区间为0。
熟悉二分查找的话,就要把注意放到 如何返回第一次出现的下标。我的思路是当找到一个与target相同的值时,跳出二分查找,用变量j去检索mid之前的数值,直到数值不等于target,那么此时j+1即为第一次出现的下标。
class Solution {
public:
/**
* @param nums: The integer array.
* @param target: Target number to find.
* @return: The first position of target. Position starts from 0.
*/
int binarySearch(vector<int> &array, int target) {
// write your code here
int i = 0,j = array.size() - 1;
int mid;
while(i <= j){
mid = (i + j) / 2;
if(array[mid] > target){
j = mid - 1;
}else if(array[mid] < target){
i = mid + 1;
}else{
j = mid - 1;
break;
}
}
while(array[j] == target){
j--;
}
mid = j + 1;
if(array[mid] == target ){
return mid;
}
return -1;
}
};
如有错误,欢迎指出。