您的位置:首页 > 其它

第六十九题(旋转数组中的最小元素)

2014-07-08 10:44 218 查看
69.旋转数组中的最小元素。

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个

排好序的数组的一个旋转,

输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数

组的最小值为1。

思路:采用一次遍历求最小值复杂度O(n),通过利用数组有序这个特点采用二分查找的方式能达到O(logn)复杂度。

数组为升序序列的旋转,分两种情况:

当旋转数目不为0时,数组中存在两个递增序列,并且前面的递增序列中的数都大于后面的序列,采用二分查找方法时,当data[mid]大于data[begin]时,说明mid位于第一个递增序列中,最小值必然在mid后面,故将begin置为mid+1,当data[mid]小于等于data[begin]时,说明mid必然位于第二个递增序列,最小值在其和begin之间,故将end置为mid,循环执行直到begin和end之间只有一个元素时,该元素就是最小值。

当旋转数目为0时(通过data[begin] < data[end]判断),数组就是一个升序序列,在这种情况下,直接返回data[begin]。

具体代码如下:

namespace MS100P_69
{
	int minOfRotate(int data[], int length)
	{
		int begin = 0, end = length - 1;
		int mid = (begin + end) / 2;
		while (end > begin)
		{
			if (data[begin] < data[end])	//特殊情况,此时无旋转
				return data[begin];
			if (data[mid] >= data[begin])	//mid位于前半部分的递增序列中
					begin = mid + 1;
			else							//mid位于第二个递增序列中
				end = mid;

			mid = (begin + end) / 2;
		}
		return data[begin];
	}
	void test()
	{
		int data[] = {4,5,6,1,2,3};
		cout << minOfRotate(data, 6);
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: