经典二分查找算法的变形
回顾经典二分查找算法:
left=0,
right=nums.size()-1,
while(left<=right)
{
media=(left+right)/2;
if(nums[media]<target)
{media=left+1;}
else if(nums[media]>target)
{media=right-1;
}else{return media;}
}
该题目解决方案
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int search(vector<int>& nums, int target) {
if (nums.empty())
return -1;
else if (nums.size() == 1)
{
if (nums[0] == target)
return 0;
else
return -1;
}
else if (nums.size() == 2)
{
if (nums[0] == target)
return 0;
else if (nums[1] == target)
return 1;
else
return -1;
}
else
{
//n>=3
int media;
if (nums[0] < nums[nums.size() - 1])
{//ascending
media = 0;
}
else
{//misorder
int mediaLast;
int mediaNext;
int left = 0, right = nums.size()-1;
bool flag = true;
while (left<=right)
{
media = (left + right) / 2;
//cout << media << endl;
mediaLast = (media - 1 >= 0) ? (media - 1) : 0;
mediaNext = (media + 1 <= nums.size() - 1) ? (media + 1) : (nums.size() - 1);
if (nums[media] <= nums[mediaLast] && nums[media] <= nums[mediaNext])
{
break;
}
else if (nums[media] >nums[mediaLast]&&nums[media]<nums[0])
{
right = media-1;
}
else if (nums[media]>=nums[mediaLast]&&nums[media]>=nums[0])
{
left = media+1;
}
}
}
//cout << "media:" << media << endl;
if (media == 0)
{
return FindPosition(0, nums.size() - 1, target, nums);
}
else if (nums[0] == target)
{
return 0;
}
else if (nums[0]>target)
{
return FindPosition(media, nums.size() - 1, target, nums);
}
else
{
return FindPosition(0, media - 1, target, nums);
}
}
return 0;
}
int FindPosition(int start, int end, int target, vector<int>& nums)
{
int media;
while (start<=end)
{
media = (start+end)/ 2;
//cout << media << endl;
//cout << start << " " << end << endl;
if (nums[media] == target)
return media;
else if (nums[media] > target)
{
end = media-1;
}
else
start = media+1;
}
return -1;
}
};
void main()
{
vector<int> Vector;
Solution solution;
//Vector = vector<int>{ 3,0,1,2};
//Vector = vector<int>{ 0,1,2,3 };
//Vector = vector<int>{ 2,3,0};
Vector = vector<int>{5,1,2,3,4};
cout << "solution=" << solution.search(Vector, 4) << endl;
system("PAUSE");
}
最优方案
class Solution
{
public:
int search(vector<int>&nums, int target)
{
int left = 0, right = nums.size() - 1;
int media;
while (left <= right)
{
media = (left + right) / 2;
if (nums[media] == target)
return media;
else if (nums[media] >= nums[right])
{//media在旋转数组的左半部分
if (nums[media] >= target && nums[left] <= target)
right = media - 1;
else
left = media + 1;
}
else
{//media在旋转数组的右半部分
if (nums[media] <= target && nums[right] >= target)
left = media + 1;
else
right = media - 1;
}
}
return -1;
}
};