leetcode 力扣 33 搜索旋转排序数组

51 阅读1分钟

二分查找只能用在已排序的数组中,所以这道题需要找到旋转后有序的部分。

比如,在123456中,对3进行旋转,得到345612mid之前是有序的,mid之后是无序的,在34中查找target (right = mid - 1;),找不到再对612继续进行二分,二分后总有一部分是有序的。

再比如,561234,在234中查找target (left = mid + 1;),对56继续进行二分。

class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;
        if (n == 1) {
            return nums[0] == target ? 0 : -1;
        }

        int left = 0;
        int right = n - 1;

        while (left <= right) {
            int mid = (left + right) >> 1;
            if (nums[mid] == target) {
                return mid;
            }

            // [left, mid]是有序的
            if (nums[left] <= nums[mid]) {

                // 包含target,对这部分进行二分查找
                if (nums[left] <= target && target < nums[mid]) {
                    right = mid - 1;
                } else {

                    // 找不到,对无序部分进行拆分
                    left = mid + 1;
                }

                // [mid + 1, right]是有序的
            } else {

                // 包含target,对这部分进行二分查找
                if (nums[mid] < target && target <= nums[right]) {
                    left = mid + 1;
                } else {

                    // 找不到,对无序部分进行拆分
                    right = mid - 1;
                }
            }
        }

        return -1;
    }
}