33. Search in Rotated Sorted Array
仅供自己学习
思路:
因为nums顺序已经被打乱,我们可以用一个hash表来存储所有元素,从而不需要考虑nums的顺序,且每次搜索都是O(1)的时间,nums的元素值为hash表的key值,索引i为value。
代码:
1 class Solution { 2 public: 3 int search(vector<int>& nums, int target) { 4 unordered_map<int,int> mp; 5 for(int i=0;i<nums.size();++i){ 6 mp[nums[i]]=i; 7 } 8 if(!mp.count(target)) return -1; 9 else return mp[target]; 10 } 11 };
还有就是用二分搜索,虽然他旋转了,但是他一个数组里面出现了两个升序排列的序列,当我们(left-right)/2获得mid后,需要判断mid是在哪一个升序序列中,如果nums[0]<=nums[mid],那么[0,mid]就是一个有序序列,那么我们就在这里面判断,target>=nums[0]&&target<nums[mid],如果在,那么就能确定来target在[0,mid)之间,所以移动right到mid-1的位置,否则target不在这个有序序列中,我们就把left移动到mid+1处,target在另一个有序序列中,或者当前序列大于mid到最大数之间。如果nums[0]>nums[mid],说明mid在[mid,size-1]的有序序列中,那么我们就判断 target>nums[mid]&&target<=nums[size-1],如果在,那么就能确定target在(mid,size-1]的范围内,那么就把left移动到mid+1的位置,否则tartget不在这个范围内,我们把right移动到mid-1,此时target可能在另一个升序序列或者在最小数到mid之间
代码:
1 class Solution { 2 public: 3 int search(vector<int>& nums, int target) { 4 int size=nums.size(); 5 if(!size) return -1; 6 if(size==1) return target==nums[0] ? 0 : -1; 7 int left=0,right=size-1; 8 while(left<=right){ 9 int mid=(left+right)/2; 10 if(nums[mid]==target) return mid; 11 if(nums[0]<=nums[mid]){ 12 if(nums[0]<=target&&target<nums[mid]) 13 right=mid-1; 14 else left=mid+1; 15 } 16 else{ 17 if(nums[mid]<target && target<=nums[size-1]) 18 left=mid+1; 19 else right=mid-1; 20 } 21 } 22 return -1; 23 } 24 };

浙公网安备 33010602011771号