LeetCode-81.Search in Rotated Sorted Array II

问题描述

  1. 给定一个数组和目标值,元素按照从小的大的顺序排列(数组元素允许重复),数组元素有可能旋转,判断该目标值是否存在数组中。
  2. 例如:[0,1,2,4,5,6,7],旋转后可能为[4,5,6,7,0,1,2]。如果目标值为2,返回true。

解题思路

  1. 一开始打算先用二分法寻找数组的旋转点,后来发现这样因为重复元素的存在无法找到旋转点。比如:1,1,3,1,1,找到nums[middle]==nums[right],无法判断middle是在旋转点前还是旋转点后。利用下面的想法,可以让right–,后面尝试实现。
  2. 后来参考别人的博客,不再去找旋转点,而是直接对原数组二分查找。
  3. 解题方法如下:
    • 如果nums[middle]大于nums[left],说明左半部分是递增区域,判断target是否存在该区域。
    • 如果nums[middle]小于nums[left],说明右半部份是递增区域,判断target是否存在该区域。
    • 如果nums[middle]等于nums[left],无法判断两边的区域是否是递增区域,让left++。

代码

public class Solution {
   public static boolean search(int[] nums,int target){
        if(nums==null || nums.length==0)
            return false;
        int left=0;
        int right=nums.length-1;
        while(left<=right){
            int middle=left+(right-left)/2;
            if(nums[middle]==target)
                return true;

            if(nums[middle]>nums[left]){
                if(nums[middle]>target && nums[left]<=target){
                    right=middle-1;
                }else{
                    left=middle+1;
                }
            }else if(nums[middle]==nums[left]){
                left++;
            }else{
                if(nums[middle]<target && target<=nums[right]){
                    left=middle+1;
                }else {
                    right=middle-1;
                }
            }
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值