题目
分析
尽可能的使用二分查找,在细节方面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次

京公网安备 11010502036488号