Medium!html
題目描述:數組
假設按照升序排序的數組在預先未知的某個點上進行了旋轉。函數
( 例如,數組 [0,0,1,2,2,5,6]
可能變爲 [2,5,6,0,0,1,2]
)。post
編寫一個函數來判斷給定的目標值是否存在於數組中。若存在返回 true
,不然返回 false
。url
示例 1:spa
輸入: nums = [2, target = 0 輸出: true ,5,6,0,0,1,2]
示例 2:code
輸入: nums = [2, target = 3 輸出: false,5,6,0,0,1,2]
進階:htm
nums
可能包含重複元素。解題思路:blog
這道是以前那道 Search in Rotated Sorted Array 在旋轉有序數組中搜索 的延伸,如今數組中容許出現重複數字,這個也會影響咱們選擇哪半邊繼續搜索,因爲以前那道題不存在相同值,咱們在比較中間值和最右值時就徹底符合以前所說的規律:若是中間的數小於最右邊的數,則右半段是有序的,若中間數大於最右邊數,則左半段是有序的。而若是能夠有重複值,就會出現來面兩種狀況,[3 1 1] 和 [1 1 3 1],對於這兩種狀況中間值等於最右值時,目標值3既能夠在左邊又能夠在右邊,那怎麼辦麼,對於這種狀況其實處理很是簡單,只要把最右值向左一位便可繼續循環,若是還相同則繼續移,直到移到不一樣值爲止,而後其餘部分還採用 Search in Rotated Sorted Array 在旋轉有序數組中搜索 中的方法,能夠獲得代碼以下。排序
C++解法一:
1 class Solution { 2 public: 3 bool search(int A[], int n, int target) { 4 if (n == 0) return false; 5 int left = 0, right = n - 1; 6 while (left <= right) { 7 int mid = (left + right) / 2; 8 if (A[mid] == target) return true; 9 else if (A[mid] < A[right]) { 10 if (A[mid] < target && A[right] >= target) left = mid + 1; 11 else right = mid - 1; 12 } else if (A[mid] > A[right]){ 13 if (A[left] <= target && A[mid] > target) right = mid - 1; 14 else left = mid + 1; 15 } else --right; 16 } 17 return false; 18 } 19 };