面试题 10.03. 搜索旋转数组

148 阅读1分钟

思路

  • 旋转过很多次,数组依然是由两个升序子数组构成的。
  • 关键在于如何返回第一出现的index。
  • [5,5,5,1,2,3,4,5]
  • [1,2,3,4,5,5,5,5]
class Solution {
    public int search(int[] arr, int target) {
        int left = 0, right = arr.length - 1;
        int index = -1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            //要先判断,当左边的索引符合时就直接返回。
            //左边索引不符合,开始做二分,如果mid符合,mid左边可能还有符合的,要找最小,这时候就更新右边界为mid-1
            if (arr[left] == target) {
                return left;
            }
            if (arr[mid] == target) {
                index = mid;
                //往索引更小的额方向找,看看有没有
                right = mid - 1;
            } else if (arr[mid] > arr[left]) {
                if (target >= arr[left] && target < arr[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else if (arr[mid] < arr[left]) {
                if (target <= arr[right] && target > arr[mid]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            } else if (arr[mid] == arr[left]) {
                left++;
            }
        }
        return index;
    }
}