62 搜尋旋轉排序陣列

2022-05-12 02:18:16 字數 1427 閱讀 9238

原題**:

你可以假設陣列中不存在重複的元素。

您在真實的面試中是否遇到過這個題?  是

給出[4, 5, 1, 2, 3]和target=0,返回 -1

標籤二分法

陣列排序陣列

思路:原始想法是找到旋轉軸 i,找到後判斷target在哪個部分,在哪個部分就對哪個部分使用二分法。時間複雜度是i+log(n-i)?

ac**:

class

solution

int i=0

;

while(i1&&a[i]1

])

if (i==size-1)//

注意陣列有可能未旋轉,所以此處判斷不可少;

else

if (target<=a[size-1])//

注意此處的邏輯是否則如果;

else

return

index;

}int binarys(int left,int right,int target,vector &a)

else

if(a[mid]else

}return -1;}

};

在網上搜尋後,看到了更好的解法,參考:

這個答案的文字描述很清晰,可以多看看。

二分查詢法是在單調區間上確定 left、right 如何移動的過程,所以使用二分查詢時應先確定區間,再在區間上查詢。

題目中陣列有兩個遞增區間,左側部分任意值大於右側部分最大值。可以先二分,判斷 target 與 mid 關係,相等return mid,不相等繼續尋找。

此時,可以判斷 mid 處元素與 left 處元素大小,若 mid 大於 left ,說明 left~mid 這段是同乙個遞增區間。若 target 在此區間,二分查詢, 即 righ = mid - 1。若 target 不在此區間,繼續尋找 target 所在的遞增區間,即 left = mid + 1;

若mid小於left,說明 mid 左側不是單調區間, mid~right 這段是同乙個遞增區間。若 target 在此區間,二分查詢,即 left = mid+1。若 target 不在此區間,繼續尋找 target 所在的遞增區間,即 righ = mid - 1 。

ac**:

class

solution

int left=0,right=size-1

,mid;

while(left<=right)

if (a[mid]>a[left]) //

left~mid在左側遞增區間上;

else

}else

//mid~right在右側遞增區間上;

else}}

return -1

;

}};

62 搜尋旋轉排序陣列

假設有乙個排序的按未知的旋轉軸旋轉的陣列 比如,0 1 2 4 5 6 7可能成為4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。你可以假設陣列中不存在重複的元素。樣例 給出 4,5,1,2,3 和target 1,返回 2 給出 4,5...

lintcode 搜尋旋轉排序陣列 62

假設有乙個排序的 按未知的旋轉軸旋轉的 陣列 比如,0 1 2 4 5 6 7可能成為 4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。你可以假設陣列中不存在重複的元素。樣例 給出 4,5,1,2,3 和target 1,返回 2 給出 ...

搜尋旋轉排序陣列

假設有乙個排序的按未知的旋轉軸旋轉的陣列 比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。你可以假設陣列中不存在重複的元素。分析 特殊的陣列搜尋某一元素問題,二分法。這一題的難點在於如何尋找二分的...