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