33-搜索旋转排序数组
code-33:
题中给明O(nlogn)的复杂度,第一个想的就是二分查找的方法,但是旋转数组是递增递减或者递减递增的,无法直接二分查找判断状况。所以判断的时候要根据具体的递增 递减情况去分区然后进行比较
1 class Solution { 2 public: 3 int search(vector<int>& nums, int target) { 4 int len=nums.size(); 5 if(len==0) 6 { 7 return -1; 8 } 9 int left=0; 10 int right=len-1; 11 while(left<=right) 12 { 13 int mid=(left+right)/2; 14 if(nums[mid]==target) 15 { 16 return mid; 17 } 18 if(nums[left]<=nums[mid]) 19 { 20 if(nums[left]<=target&&target<=nums[mid]) 21 { 22 right=mid-1; 23 } 24 else 25 { 26 left=mid+1; 27 } 28 } 29 else 30 { 31 if(nums[mid]<=target&&target<=nums[right]) 32 { 33 left=mid+1; 34 } 35 else{ 36 right=mid-1; 37 } 38 } 39 40 } 41 return -1; 42 43 } 44 };
code-153:
跟33类似,确定递增的数组区域,[left,mid] or [mid,right] 递增的话left(mid)对应的元素就是当前递增数组的最小值,存入最小值变量res中,然后对剩下那一块非递增区域在一次进行判断,直到left=right判断
1 class Solution { 2 public: 3 int findMin(vector<int>& nums) { 4 int len=nums.size(); 5 int left=0; 6 int right=len-1; 7 int res=INT_MAX; 8 while(left<=right) 9 { 10 int mid=(left+right)/2; 11 if(nums[left]<=nums[mid]) 12 { 13 if(res>nums[left]) 14 { 15 res=nums[left]; 16 } 17 left=mid+1; 18 } 19 else 20 { 21 if(res>nums[mid]) 22 { 23 res=nums[mid]; 24 } 25 right=mid-1; 26 } 27 } 28 return res; 29 30 31 } 32 };
——世界上从来不乏优秀的人,我只是想接近他们一点。