33.搜索旋转排序数组

因为复杂度肯定是logn,所以想到了和快速幂类似的方式,每次向外跨2的n次方直到先找到边界,找到后决定在哪部分进行二分。
但是我在实际编程的时候贼慢,主要原因在与向外跨的时候需要3个变量,一个是最左侧的位置,一个是本次跨到的位置,一个是下次跨到的位置。如果本次和下次不是单调的,就说明边界就在本次之后,让左侧等于左边界,再重复一便就可以了。直到这个点就是边界

clas

s Solution {
public:
int getbound(vector<int>nums)
{
	int left= 0;
	while(left+1<nums.size() && nums[left]<nums[left+1])
	{
		int next = left+1;
		int i=0;
		int cur = left;
		while(next<nums.size())
		{
			if(nums[cur]<=nums[next])
				cur = next;
			else
				break;
			next = cur + (1<<i);///<每次向外扩2的
			次方
			i++;
		}
		left = cur;
	}
	return left;
}
int search(vector<int>& nums, int target) {
	if(nums.empty())
		return -1;
	int bound = getbound(nums);
	int start=0, end=nums.size();///<左闭右开
	if(nums[0]>target)
	{
		start=bound+1;
		end=nums.size();
	}
	else
	{
		start=0;
		end=bound+1;
	}
	auto it = lower_bound(nums.begin()+start, nums.begin()+end, target);
	int ret = -1;
	if(it!=nums.begin()+end && *it==target)
		ret = it-nums.begin();
	return ret;
}

};
上一篇:打破格式壁垒 !COS助力腾讯文档优化在线预览效果


下一篇:Matlab中legend函数使用