1. 二分查找
通过左和中的大小关系判断是升序还是中间旋转了。
时间O(logn)
,空间O(1)
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| class Solution { public: int search(vector<int>& nums, int target) { int n = nums.size(); if (n == 0) return -1; int ans = -1; int left = 0, right = n - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[left] > target) { if (nums[mid] >= nums[left]) left = mid + 1; else { if (nums[mid] > target) right = mid - 1; else if (nums[mid] < target) left = mid + 1; else { ans = mid; break; } } } else if (nums[left] < target) { if (nums[mid] >= nums[left]) { if (nums[mid] > target) right = mid - 1; else if (nums[mid] < target) left = mid + 1; else { ans = mid; break; } } else right = mid - 1; } else { ans = left; break; } }
return ans; } };
|