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 };

 

posted @ 2021-03-10 11:51  Mrsdwang  阅读(37)  评论(0)    收藏  举报