81. Search in Rotated Sorted Array II

Lc-81

81. Search in Rotated Sorted Array II

题目大意:

假设一个单调递增的数组在某一个结点进行旋转使的数组内的所有元素变成两个单调递增的元素
i.e. [0, 0, 1, 2, 2, 5, 6] --> [2, 5, 6, 0, 0, 1, 2];
给定一个目标整数进行搜索, 如果在数组中找到返回true, 找不到返回false;

解题思路:

根据题目要求,我们先可以排除一些特别情况
比如如果nums == null 或者nums的数组为空则返回false;
然后像往常一样设置两个自变量代表数组两端的下标,low and high
while loop进行二分循环遍历,条件为low < high; 计算出当前mid值通过当前low和high。
如果mid下标所指的数组中的元素等于target, 返回true;
如果mid下标所指的元素 大于 当前最low下标的元素则会有以下的情况:
    如果目标元素大于等于 当前最low下标的元素并且 小于 当前mid下标的元素,
    说明target在左侧的单调递增数组中,则当前high = mid(只考虑左侧数组)
    反之 target在右侧单调递增数组里, 那么low = mid + 1(只考虑右侧数组)
如果mid下标所指的元素 小于 当前最low下标的元素则会有以下情况:
    如果target目标元素大于mid下标的元素并且小于当前low下标的元素, 
    说明target在右侧单调递增的数组中, 那么让low下标 等于 mid+1
    否则则在左侧的单调递增数组中, high下标等于mid
如果上述情况都不满足, 则说明nums[mid] == nums[low], 那么low++;

如果low > high 跳出while loop则返回false。

注意:

None

复杂度:

Time Coplexity: O(logN)
Space Complexity: O(1)

代码示例:

class Solution {
    public boolean search(int[] nums, int target) {
        if (nums == null || nums.length == 0) return false;
        int low = 0, high = nums.length;
        
        while (low < high) {
            int mid = low + (high - low)/2;
            if (nums[mid] == target) return true;
            if (nums[mid] > nums[low]) {
                if (target < nums[mid] && target >= nums[low]) high = mid;
                else low = mid + 1;
            }else if (nums[mid] < nums[low]) {
                if (target > nums[mid] && target < nums[low]) low = mid+1;
                else high = mid;
            } else low++;
        }
        
        return false;       
    }
}

你可能感兴趣的:(Binary,Search,leetcode,java)