給定一個(gè)排序的整數(shù)數(shù)組(升序)和一個(gè)要查找的整數(shù)target,用O(logn)的時(shí)間查找到target第一次出現(xiàn)的下標(biāo)(從0開始),如果target不存在于數(shù)組中,返回-1。
如:在數(shù)組 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
思路:二分查找是基本功,可以寫迭代也可以寫while循環(huán),目前還是習(xí)慣寫while循環(huán)一些,但是這里的要求和一般的二分查找還不太一樣,主要的原因是題目要求查找出第一個(gè),也就是即使找到了一個(gè),也不能立即返回,需要找到第一個(gè)才行,我想了一下,有一個(gè)思路:找到了把結(jié)果賦值給一個(gè)變量,然后end更新為mid-1(因?yàn)榈谝粋€(gè)肯定比這個(gè)索引小,如果存在的話),一直把所有的二分查找都找完,返回最新的一個(gè)查找的結(jié)果就是要求的第一個(gè)的索引:
int binarySearch(vector<int> &array, int target) {
auto beg=array.begin();
auto end=array.end()-1;
int res=-1; //如果這個(gè)res最后還是-1的話,就說明沒有找到。
while(beg<=end)
{
auto mid=beg+(end-beg)/2;
if(*mid==target)
{
res=mid-array.begin(); //這里是找到了,但不能保證是第一個(gè)
end=mid-1; //mid仍然更新。
}
if(*mid<target)
beg=mid+1;
if(*mid>target)
end=mid-1;
}
if(res!=-1)
return res;
// write your code here
return -1;
}
over