这个题和剑指上旋转数组求最小值有点不一样,还是用二分查找的方法做,但条件判断较为繁琐。首先明确一点,无论怎么分,左右两侧总有一个是有序的,并且一般情况左侧是大的数,右侧是小的数。mid小于target的时候,相当于要找一个更大的数,所以想法是先排除一般情况下小的数,如果start < mid,证明这是个升序,那只可能在右侧;如果start > mid,证明右侧是升序,只要和最大的比较,也就是end,如果比end小,说明数字在右侧,如果比end大,说明数字在左侧,因为比最大的都大了。
总体上就是当target大于mid的时候,就去比较可能出现大数的左侧区间,如果是升序,那就能排除;如果左侧区间不是升序,则右侧是升序,需要拿这个升序的最大值和mid进行比较来确定下一个区间
class Solution {public: int search(vector & nums, int target) { int length = nums.size(); if(length <= 0) return -1; int start = 0; int end = length - 1; while(start <= end){ int mid = (start + end)/2; if(nums[mid] == target) return mid; else if(nums[mid] < target){ if(nums[mid] > nums[start]) start = mid + 1; else{ if(target > nums[end]) end = mid - 1; else start = mid + 1; } } else{ if(nums[mid] < nums[end]){ end = mid - 1; } else{ if(target < nums[start]) start = mid + 1; else end = mid - 1; } } } return -1; }};
https://www.cnblogs.com/springfor/p/3858140.html
81. Search in Rotated Sorted Array II
这个代码超时了
class Solution {public: bool search(vector & nums, int target) { int length = nums.size(); if(length <= 0) return false; int start = 0; int end = length - 1; while(start <= end){ int mid = (start + mid)/2; if(nums[mid] == target) return true; else if(nums[mid] > target){ if(nums[mid] == nums[end]) end--; else if(nums[mid] < nums[end]) end = mid - 1; else{ if(target < nums[start]) start = mid + 1; else end = mid - 1; } } else{ if(nums[mid] == nums[start]) start++; else if(nums[mid] > nums[start]) start = mid + 1; else{ if(target > nums[end]) end = mid - 1; else start = mid + 1; } } } return false; }};
https://www.cnblogs.com/springfor/p/3859525.html