面试题--数组旋转续

直接上题意了:给定N个数字的组成的递增串,现在使其向做或者向左或者向右旋转K位。问:找到数组中最小数的是多少?


方案一:

由于原串是递增串通过旋转得到的。故想都不用想就可以得到如下第一种解决方案

int Find(int n)
{
	for (int i = 0; i < n; i++)
	{
		if (a[(i + n - 1) % n] > a[i])
		{
			return i;//找到前一个大于当前的元素,就可以确定我们所需要得到值的下标
		}
	}
	return 0;
}


方案二:
上一种方案是很容易想到的,但是如果N很大时就得不偿失了。我们仔细阅读题目,可以知道,原串是递增的,通过旋转得到。因此,我们可以使用 二分。使用二分的过程中,我们会使用到left,right,mid,因此我们可以分为3种情况讨论。

1.当前位置mid就是最小的位置,直接返回mid;

2.a[mid] > a[right],则是right = mid + 1;

3.当前两种都不满足时,left = mid - 1.


稍微说明下:由于,原串升序,向左移动K位,那么后K位怎么都不会大于前面的数字。否则就违背了递增串了。当然K < N。

int search(int left, int right, int n)//n为元素个数
{
	int mid = 0;
	while (left < right)
	{
		mid = (left + right) / 2;
		
		if (a[mid] < a[(mid - 1 + n) % n ])//找到最小的位置
		{
			return mid;
		}
		else if (a[mid] > a[right])//判断在右边块
		{
			left = mid + 1;
		}
		else right = mid - 1;//左边块
	}
	return left;
}
至此,暂时想到两种解决方案,欢迎补充新想法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值