# 33. Search in Rotated Sorted Array ###### tags: `C++` `LeetCode` `Medium` ## Notes ``` 觀察一個 nums 陣列 {4, 5, 6, 7, 0, 1, 2} 我們可以知道被 rotate 之後的 nums 可以理解為兩個 ascending-order vector 組成 要怎麼知道一個數字是屬於前面的陣列或是後面的陣列 只要他比第一個 element 小 就是第二個陣列 比第一個 element 大 就是第一個陣列 透過這個判斷方法我們可以找出 pivot pivot 是第二個陣列的第一個 element 他的左側比他小右側比他大 整個陣列只有 pivot 有這樣的特性 找到 pivot 之後就可以判斷 target 是屬於第一個陣列或第二個陣列 使用單純的 binary search 就可以得出答案 ``` ## Code ```c++ #include <vector> #include <iostream> using namespace std; int search(vector<int>& nums, int target); bool isRotate(vector<int> nums); int findPivot(vector<int> nums); int binarySearch(vector<int>, int left, int right, int target); int main() { vector<int> nums = {3, 1}; cout << search(nums, 0) << endl; return 0; } int search(vector<int>& nums, int target) { int first = nums[0]; int len = nums.size(); int pivot = 0; if(isRotate(nums)) { pivot = findPivot(nums); if(target == first) return 0; if(target > first) return binarySearch(nums, 0, pivot - 1, target); if (target < first) return binarySearch(nums, pivot, len - 1, target); } else { return binarySearch(nums, 0, len - 1, target); } return 0; } bool isRotate(vector<int> nums) { if(*(nums.begin()) > *(nums.end() - 1)) return true; return false; } int findPivot(vector<int> nums) { int len = nums.size(); int left = 0; int right = len - 1; int middle = 0; int first = nums[0]; while(1) { middle = (left + right) / 2; if(middle == 0) return 1; if(nums[middle - 1] > nums[middle]) return middle; else if(nums[middle] < first) right = middle - 1; else left = middle + 1; } } int binarySearch(vector<int> nums, int left, int right, int target) { int middle = 0; while(left <= right) { middle = (left + right) / 2; if(nums[middle] == target) return middle; else if(target < nums[middle]) right = middle - 1; else left = middle + 1; } return -1; } ```