給定一個(gè)排序的整數(shù)數(shù)組(升序)和一個(gè)要查找的整數(shù)target,用O(logn)的時(shí)間查找到target第一次出現(xiàn)的下標(biāo)(從0開(kāi)始)怖竭,如果target不存在于數(shù)組中剩晴,返回-1。
如:在數(shù)組 [1, 2, 3, 3, 4, 5, 10] 中二分查找3侵状,返回2赞弥。
思路:二分查找是基本功,可以寫(xiě)迭代也可以寫(xiě)while循環(huán)趣兄,目前還是習(xí)慣寫(xiě)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的話迄汛,就說(shuō)明沒(méi)有找到捍壤。
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