Leet Code 33.搜索旋转排序数组

题目

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是O(logn) 级别。

思路

由于时间复杂度的限制,可以想到需要使用二分查找。

整个数组只保持了局部有序。通过观察,可以发现,我们可以通过判断mid位置、最左位置和最右位置的大小关系,来分辨出target应该在哪一边,以此来达到二分查找的选边。

通过旋转,有两个局部升序数组,我们将mid的数与len比较,如果大于,则左边是有序的。将mid的数与right比较,如果小于,则右边是有序的。
同时,判断目标值是不是在这个有序数组中,若在,这减小搜索范围,不在,则到另一边继续用相同策略搜索。

这道题关键的一点是,right的值一定小于left的值

代码

class Solution {
    public int search(int[] nums, int target) {
        if (nums.length == 0) return -1;
        int i = 0, j = nums.length - 1;
        while(i <= j) {
            int mid = (i + j) / 2;
            if (nums[mid] == target) return mid;
            
            if (nums[mid] >= nums[i]) {
                if (nums[i] <= target && nums[mid] > target) {
                    j = mid - 1;
                }
                else {
                    i = mid + 1;
                }
            }
            else if (nums[mid] <= nums[j]) {
                if (nums[mid] < target && nums[j] >= target) {
                    i = mid + 1;
                }
                else {
                    j = mid - 1;
                }
            }
        }
        return -1;
    }
}
原文地址:https://www.cnblogs.com/chenshaowei/p/13180976.html