Search in Rotated Sorted Array

经典二分查找算法的变形

回顾经典二分查找算法:

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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值