题目

分析

尽可能的使用二分查找,在细节方面start<=end.
如果中间恰好是的话就直接返回位置了
如果start,end,mid三个位置的值是相等的话,就要分为两种情况进行讨论了,无非就是如下

4 4 4 4 1 2 4
4 1 2 4 4 4 4 

也就是最低点在哪儿的不同。
如下

如果start和mid不相等的话
在分出两种情况
num[start]<num[mid]
         拿其中的一个情况来进行说明,if(target>=num[start]&&target<num[mid])//target不可能等于mid的
  然后就是二分查找一系列的内容 
num[start]>num[mid]


如果end和mid不相等的话
在分出两种情况
num[end]<num[mid]
num[end]>num[mid]

代码展示

public class Solution {
    public int search(int[] nums, int target) {
         int start=0;
        int end=nums.length-1;
        while(start<=end)
        {
            int mid=(start+end)/2;
            if(nums[mid]==target) return mid;
            if(start==end) break;
            if(nums[mid]==nums[start]&&nums[mid]==nums[end])
            {
                while(start!=mid&&nums[start]==nums[mid])
                {
                    start++;
                }
                if(start!=mid)
                {
                    end=mid-1;
                }
                continue;
            }
            else if(nums[mid]!=nums[start])
            {
               if(nums[mid]>nums[start])//前半部分递增
               {
                   if(target>=nums[start]&&target<nums[mid])
                   {
                       end=mid-1;
                   }else
                   {
                       start=mid+1;
                   }
               }
               else if(nums[mid]<nums[start])
               {
                   if(target>nums[mid]&&target<=nums[end])
                   {
                       start=mid+1;
                   }else
                   {
                       end=mid-1;
                   }
               }

            }else if(nums[mid]!=nums[end])
            {
                if(nums[mid]>nums[end])//前半部分递增
                {
                    if(target>=nums[start]&&target<nums[mid])
                    {
                        end=mid-1;
                    }else
                    {
                        start=mid+1;
                    }
                }
                else if(nums[mid]<nums[end])
                {
                   if(target>nums[mid]&&target<=nums[end])
                    {
                        start=mid+1;
                    }else
                    {
                        end=mid-1;
                    }
                }
            }

        }
        return -1;
    }
}

完成情况

学习情况 1次