美文网首页
33. 搜索旋转排序数组

33. 搜索旋转排序数组

作者: Andysys | 来源:发表于2019-12-29 00:22 被阅读0次
    // main
    public int search(int[] nums, int target) {
        int n = nums.length;
        if (n == 0) {
            return -1;
        }
        if (n == 1) {
            return nums[0] == target ? 0 : -1;
        }
        int rotateIndex = findRotateIndex(nums, 0, n - 1);
        if (nums[rotateIndex] == target) {
            return rotateIndex;
        }
        if (rotateIndex == 0) {
            return search(nums, 0, n - 1, target);
        }
        if (target < nums[0]) {
            return search(nums, rotateIndex + 1, n - 1, target);
        } else {
            return search(nums, 0, rotateIndex - 1, target);
        }
    }

    private int search(int[] nums, int left, int right, int target) {
        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;
    }

    private int findRotateIndex(int[] nums, int left, int right) {
        if (nums[left] < nums[right]) {
            return left;
        }
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] > nums[mid + 1]) {
                return mid + 1;
            } else {
                if (nums[mid] < nums[left]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            }
        }
        return 0;
    }

相关文章

网友评论

      本文标题:33. 搜索旋转排序数组

      本文链接:https://www.haomeiwen.com/subject/jybeoctx.html