Problem: 33. 搜索旋转排序数组
题目描述
思路
找到旋转那个点的下标k,如果target大于nums[0],说明target在(0,k)区间,否则则在后面那个区间(k+1,nums.size()-1),找到在哪区间就去哪个区间使用二分查找法。
解题方法
找到旋转点下标k,确定区间,确定left和right的值,然后用二分查找
复杂度
时间复杂度:
O ( n ) O(n) O(n)
Code
class Solution {
public:
int search(vector<int>& nums, int target) {
int k,left,right,mid;
for ( k = 0; k < nums.size()-1; k++)
{
if (nums[k]>nums[k+1])
{
break;
}
}
if (target >= nums[0]) {
left = 0, right = k;
}
else
{
left = k+1, right = nums.size() - 1;
}
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] > target) {
right = mid - 1;
}
else if (nums[mid] < target) {
left = mid + 1;
}
else {
return mid;
}
}
return -1;
}
};