LeetCode(81): 搜索旋轉排序數組 II


Medium!

題目描述:

假設按照升序排序的數組在預先未知的某個點上進行了旋轉。

( 例如,數組 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。

編寫一個函數來判斷給定的目標值是否存在於數組中。若存在返回 true,否則返回 false

示例 1:

輸入: nums = [2,5,6,0,0,1,2], target = 0
輸出: true

示例 2:

輸入: nums = [2,5,6,0,0,1,2], target = 3
輸出: false

進階:

  • 這是 搜索旋轉排序數組 的延伸題目,本題中的 nums  可能包含重復元素。
  • 這會影響到程序的時間復雜度嗎?會有怎樣的影響,為什么?

解題思路:

這道是之前那道 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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM