Leetcode33.Search_In_Rotated_Sorted_Array

搜索旋转数组和搜索排序数组唯一的区别在于需要寻找旋转的位置。
e.g. { 4,5,6,7,8,1,2,3 }
取其中间位置[(0+7)/2]是第三’7’,'7’比4大证明‘7’前边的数组是有序的,若target在4-7之间,即可用二分查找得出答案。
若不在该区间则以同样方法搜索{ 8,1,2,3 }这个数组。直到数组元素≤2,target若与剩余2个数都不相同则返回-1。
时间复杂度:O(logN)
C++代码:

class Solution {	
public:
	int binary_search(vector<int> &nums,vector<int>::iterator st, vector<int>::iterator en, int target)
	{
		while (1)
		{
			if (st + 1 == en)
				if (*en == target)
					return en - nums.begin();
				else if (*st == target)
					return st - nums.begin();
				else
				{
					return -1;
				}
			auto mid = st + ((en - st) >> 1);
			if (*mid == target)
				return mid - nums.begin();
			else if (*mid > target)
				en = mid;
			else
				st = mid;
		}
	}
	int search(vector<int>& nums, int target) {
		if (nums.size() <= 2)
		{
			for (int i = 0; i < nums.size(); i++)
				if (nums[i] == target)
					return i;
			return -1;
		}
		auto start_it = nums.begin(), end_it = nums.end() - 1;
		while (1)
		{
			if (start_it == end_it - 1)
			{
				if (target != *start_it && target != *end_it)
					return -1;
			}
			auto mid_it = start_it + (end_it - start_it) / 2;
			if (*start_it == target)
				return start_it - nums.begin();
			if (*mid_it == target)
			{
				return mid_it - nums.begin();
			}
			if (*end_it == target)
				return end_it - nums.begin();
			if (*mid_it < *end_it)			//后半段有序
			{
				if (target > *mid_it && target < *end_it)
				{
					return binary_search(nums, mid_it, end_it, target);
				}
				else
					end_it = mid_it;
			}
			else if (*mid_it > *start_it)	//前半段有序
			{
				if (target > *start_it && target < *mid_it)
				{
					return binary_search(nums, start_it, mid_it, target);
				}
				else
					start_it = mid_it;
			}
		}
	}
};

猜你喜欢

转载自blog.csdn.net/qq_42263831/article/details/82865739