我们可以根据这个来binary search: case 1: low <= high,此时low就是最小的数,即pivot case 2: prev > mid < next,找到pivot case 3: mid <= high,pivot在左边,因为prev更小 case 4: mid > high( low > high ), pivot在右边,因为next更小
Solution:
Time: O(logn) Space: O(1)
public class Solution { // DO NOT MODIFY THE LIST public int findMin(final List<Integer> a) { int left = 0; int right = a.size() - 1; int n = a.size(); while (left <= right) { int lVal = a.get(left); int rVal = a.get(right); int mid = left + (right - left) / 2; int next = (mid + 1) % n; int prev = (mid + n - 1) % n; int mVal = a.get(mid); if (lVal <= rVal) { return lVal; } else if (a.get(prev) >= mVal && mVal <= a.get(next)) { return mVal; } else if (mVal <= rVal) { right = mid - 1; } else { left = mid + 1; } } return -1; } }