给定一个排序数组nums(nums中无重复元素),且nums可能以某个未知下标旋转,给定目标值target,求target是否在nums中出现,若出现返回所在下标,未出现返回-1。
原数组:
[1,3,6,7,9,12,15,20]
可能的旋转结果:
[3,6,7,9,12,15,20,1]
[6,7,9,12,15,20,1,3]
[7,9,12,15,20,1,3,6]
[9,12,15,20,1,3,6,7]
[12,15,20,1,3,6,7,9]
[15,20,1,3,6,7,9,12]
[20,1,3,6,7,9,12,15]
该题就是需要对各种可能的情况进行一一讨论。
#include<vector>
class Solution
{
public:
Solution() {}
~Solution() {}
int search(std::vector<int> &nums, int target)
{
int begin = 0;
int end = nums.size() - 1;
while (begin<=end)
{
int mid = (begin + end) / 2;
if (target==nums[mid])
{
return mid;
}
else if (target<nums[mid])
{
if (nums[begin]<nums[mid])
{
if (nums[begin]<=target)
{
end = mid - 1;
}
else
{
begin = mid + 1;
}
}
else if (nums[begin]>nums[mid])
{
end = mid - 1;
}
else if (nums[begin]==nums[mid])
{
begin = mid + 1;
}
}
else if (target>nums[mid])
{
if (nums[begin] < nums[mid])
{
begin = mid + 1;
}
else if (nums[begin] > nums[mid])
{
if (nums[begin]>target)
{
begin = mid + 1;
}
else if (nums[begin]<=target)
{
end = mid - 1;
}
}
else if (nums[begin] == nums[mid])
{
begin = mid + 1;
}
}
}
return -1;
}
};
int main()
{
int test[] = {9,12,15,20,1,3,6,7};
std::vector<int> nums;
Solution solve;
for (int i = 0; i < sizeof(test)/sizeof(test[0]); i++)
{
nums.push_back(test[i]);
}
for (int i = 0; i < 22; i++)
{
printf("%d: %d\n",i, solve.search(nums,i));
}
return 0;
}
运行结果为:
0: -1
1: 4
2: -1
3: 5
4: -1
5: -1
6: 6
7: 7
8: -1
9: 0
10: -1
11: -1
12: 1
13: -1
14: -1
15: 2
16: -1
17: -1
18: -1
19: -1
20: 3
21: -1