Question:
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4
).
5 6 7 0 1 2
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
Algorithm:
先找顺序,再找target
有三种情况:(至少有一半是顺序的)
1、nums[mid]==target
2、nums[first]<nums[mid](左半是顺序,如果target在范围内,二分,如果不在,则在右半找顺序,即重复1,2,3)
3、nums[first]>=nums[mid](右半是顺序,如果target在范围内,二分,如果不在,则在左半找顺序,则重复1,2,3)
Accepted Code:
/* 旋转数组只能有三种情况: 1. 左半部分和有半部分都是按顺序的。旋转主元恰好是中间的数字。 2. 只有左半部分是按顺序的。旋转主元在左半部分。 3. 只有右半部分是按顺序的。旋转主元在右半部分。 所以至少有一半是按顺序的,可以用排除法确定每一次二分查找的 上界和下界。 1. 左半部分是按顺序 2. 左半部分不是按顺序的,那么右半部分肯定是按顺序的 不断缩小范围。 */ class Solution { public: int search(vector<int>& nums, int target) { int res=-1; int l=0; int r=nums.size()-1; int mid=0; while(l<=r) { int mid=l+(r-l)/2; if(nums[mid]==target) return mid; else if(nums[l]<nums[mid]) //mid左边是顺序 { if(nums[l]<=target&&nums[mid-1]>=target) r=mid-1; else l=mid+1; } else //mid右边是顺序 { if(nums[mid+1]<=target&&nums[r]>=target) l=mid+1; else r=mid-1; } } if(nums[mid]==target) return mid; else return -1; } };
时间: 2024-10-12 03:57:34