思考
这道题是在LeetCode33题目的基础上进行提升的,关键是如何判断重复,当
numd[middle]==nums[left]
时的分支选择;
当
nums[left]==nums[middle]
说明在[left,middle]
区间内是无序的,则可以若nums[left]==target直接返回
,否则left=left+1
代码
package com.zj.Aaaray.BinarySearch;
/**
* @Auther Jian Zhou
* @Date 2020/7/19
* 搜索旋转排序数组II(数组中包含重复元素)
*/
public class Problem81 {
public boolean search(int[] nums, int target) {
if(nums==null) return false;
if(nums.length==0) return false;
int length = nums.length;
int left = 0;
int right = length-1;
//left<right
while (left<right){
int middle = (left+right)>>>1;
//假如nums[middle]>nums[left] 说明在 [left,middle]是升序的
if(nums[middle]>nums[left]){
//假如 nums[left]=<target<=nums[middle]
//则搜索区间可以固定在left[middle]
if(target>=nums[left]&&target<=nums[middle]){
right=middle;
}else{
left=middle+1;
}
}else if(nums[middle]<nums[left]){
//数组在[middle+1,right]是升序的
//假如target处于 [middle+1,right]之间
//则可以确定 left = middle+1;
if(target>=nums[middle+1]&&target<=nums[right]){
left=middle+1;
}else{
right=middle;
}
}else{
//这种情况就是nums[middle]==nums[left]的情况,说明在left,middle之间的元素是相等的
//则此时可以
//要在除掉左边界之前,先看一看左边界可不可以排除
if(nums[left]==target) return true;
//为什么是lef=left+1
else left=left+1;
}
}
if(nums[left]==target) return true;
return false;
}
public static void main(String[] args) {
int[] nums = {1,1,3,1};
Problem81 problem81 = new Problem81();
boolean b = problem81.search(nums, 3);
System.out.println(b);
}
}