解題思路
分三個部分:
1. 藉由 binary search 的方式找到 pivot。
2. 由 pivot 可推知 target 在其左邊還右邊,更新 left 與 right
3. 拿更新後的 left 與 right 再做一次 binary search 找 target。
pivot 是指 sorted array 經過旋轉後產生的不連續遞增斷點的右側,ex: [4,5,6,7,0,1,2] 中的 0。
一直卡在 pivot 求法,最後求助於 chatGPT 生出答案,改天再寫一次。
程式碼
class Solution { public: int findPivot(vector<int>& nums) { int left = 0, right = nums.size() - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[right]) left = mid + 1; else right = mid; } return left; } int search(vector<int>& nums, int target) { if (nums.empty()) return -1; int pivot = findPivot(nums); int left, right; if (target >= nums[pivot] && target <= nums[nums.size() - 1]) { left = pivot; right = nums.size() - 1; } else { left = 0; right = pivot - 1; } while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1; else right = mid - 1; } return -1; } };
沒有留言:
張貼留言