leetcode 81. Search in Rotated Sorted Array II-旋转数组|二分查找

原题链接:81. Search in Rotated Sorted Array II

【思路-Java、Python】 二分查找实现

本题采用二分法实现,但是比较挠头的是边界问题,而且元素有重复,相比纯粹递增的数组难度要大得多,要解决这个问题,首先要对所有可能情况进行分类,然后对每种可能的类别进行相应的处理,本题的类别可以表示为下面的趋势图

leetcode 81. Search in Rotated Sorted Array II-旋转数组|二分查找_第1张图片

暂且不考虑nums[mid] = nums[left]的情况,本题大致可以简化为上图两种情况,可能的情况划分出来,那么解决本题就比较容易了:

当 nums[mid] = nums[left] 时,这时由于很难判断 target 会落在哪,那么只能采取 left++

当 nums[mid] > nums[left] 时,这时可以分为两种情况,判断左半部比较简单

当 nums[mid] < nums[left] 时,这时可以分为两种情况,判断右半部比较简单

public class Solution {
    public boolean search(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (target == nums[mid]) return true;
            if (nums[mid] == nums[left]) left++;
            else if (nums[mid] > nums[left]) {
                if (nums[left] <= target && nums[mid] > target) right = mid - 1;
                else left = mid + 1;
            } else {
                if (nums[mid] < target && target <= nums[right]) left = mid + 1;
                else right = mid - 1;
            }
        }
        return false;
    }
}
271 / 271  test cases passed. Runtime: 1 ms  Your runtime beats 23.71% of javasubmissions.

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: bool
        """
        left, right = 0, len(nums) - 1
        while left <= right :
            mid = (left+right) / 2
            if nums[mid] == target : return True
            if nums[mid] == nums[left] : left += 1
            elif nums[mid] > nums[left] :
                if nums[mid] > target and nums[left] <= target :
                    right = mid - 1
                else : left = mid + 1
            else :
                if nums[mid] < target and nums[right] >= target :
                    left = mid + 1
                else : right = mid - 1
        return False
271 / 271  test cases passed. Runtime: 56 ms  Your runtime beats 57.35% of pythonsubmissions.


你可能感兴趣的:(LeetCode)