解題思路:
? ? ? ? 1.獲取信息:
? ? ? ? ? ? ? ? 給定一個非遞減順序的整數數組,要求找出給定元素在該數組中從左往右第一次出現的位置和最后一個出現的位置,即:最右邊的位置和最左邊的位置
? ? ? ? ? ? ? ? 如果不存在該元素,則返回{ -1 , -1 }
? ? ? ? ? ? ? ? 限制條件:時間復雜度必須是O(log N)
? ? ? ? 2.分析題目:(因為這道題我只寫出了一種方法,所以我會在這個環節就開始講解思路了)
? ? ? ? ? ? ? ? 看到這個復雜度,讓我想到了二分查找法,那么該怎么用二分查找法來解出這道題呢?
? ? ? ? ? ? ? ? 我們想到,這個數組是一個非遞減順序的整數數組,所以
? ? ? ? ? ? ? ? 如果其中有我們要查找的那個元素,那么即使它存在多個,也會挨在一起
? ? ? ? ? ? ? ? 那我們只需先使用二分查找法找出那個元素,就可以確定我們要找出的那個元素聚集在哪個位置了,這個時候,只需找出這個聚集地的末端和首端即可
? ? ? ? ? ? ? ? 現在來說,當我們第一次查找到了我們要找的那個元素時,此時無非就三種情況
? ? ? ? ? ? ? ? (1)查找到了首端
? ? ? ? ? ? ? ? ? ? ? ? 存下首端位置后,接著向后查找末端位置即可
? ? ? ? ? ? ? ? (2)查找到了末端
? ? ? ? ? ? ? ? ? ? ? ? 存下末端位置后,接著向前查找首端位置即可
? ? ? ? ? ? ? ? (3)查找到了中間
? ? ? ? ? ? ? ? ? ? ? ? 此時要進行兩次查找了,分別向前查找首端和向后查找末端即可
? ? ? ? ? ? ? ? 以上就是本題的思路,代碼會在最后一個環節
? ? ? ? 3.示例查驗:
? ? ? ? ? ? ? ? 示例1,示例2和示例3:你可以根據示例來驗證一下上述思路是否正確
? ? ? ? 4.嘗試編寫代碼:
? ? ? ? ? ? ? ? (1)二分查找法
? ? ? ? ? ? ? ? ? ? ? ? 思路:就如分析題目的環節所說,你可以結合我的代碼來進行理解,以下是完整代碼
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int begin=0,end=nums.size()-1;//開始第一次查找vector<int>res(2,-1);//準備好存儲結果的容器while(begin<=end){int mid=(begin+end)/2;if(nums[mid]==target){//查找到了那個元素int newbegin1=mid,newend1=end;while(newbegin1<newend1){//向后查找末端位置if(newend1-newbegin1==1){newbegin1=(nums[newend1]==target)?newend1:newbegin1;break;}int newmid=(newbegin1+newend1)/2;if(nums[newmid]==target)newbegin1=newmid;else newend1=newmid-1;}res[1]=newbegin1;int newbegin2=begin,newend2=mid;while(newbegin2<newend2){//向前查找前端位置if(newend2-newbegin2==1){newend2=(nums[newbegin2]==target)?newbegin2:newend2;break;}int newmid=(newbegin2+newend2)/2;if(nums[newmid]==target)newend2=newmid;else newbegin2=newmid+1;}res[0]=newend2;return res;}else if(nums[mid]<target)begin=mid+1;//二分查找法的老步驟,就不過多闡述else if(nums[mid]>target)end=mid-1;}return res;//如果沒有查找到就直接返回結果{-1,-1}}
};
以上就是這次題解的全部內容,希望能夠幫到你,讓你有所收獲