lintcode 160 寻找旋转排序数组中的最小值 II

假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。

你需要找到其中最小的元素。

数组中可能存在重复的元素。

样例

给出[4,4,5,6,7,0,1,2]  返回 0

解析:这个题目我们可以使用二分法的思想去解决,因为数组是有序的(分开的两部分)

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
	/**
	* @param num: the rotated sorted array
	* @return: the minimum number in the array
	*/
	int findMin(vector<int> &num) {
		// write your code here
		int len = num.size();
		if (len<1)
		{
			return 0;
		}

		int mid = 0;
		int low = 0;
		int height = len-1;
		while (num[low]>=num[height])
		{
			if (height - low == 1)
			{
				return num[height];
			}

			mid = (low + height) / 2;
			//如果low height mid的值相同,只能顺序查找
			if (num[low] == num[mid] && num[mid] == num[height] && num[height] == num[low])
			{
				return MinInOrder(num, low, height);
			}

			if (num[mid]>=num[low])
			{
				low = mid;
			}
			else if (num[height] >= num[mid])
			{
				height = mid;
			}
		}

		return num[mid];
	}

	int MinInOrder(vector<int> array, int low, int height)
	{
		int result = array[low];
		for (int i = low + 1; i <= height;i++)
		{
			if (result>array[i])
			{
				result = array[i];
			}
		}

		return result;
	}
};

int main()
{
	int a[] = { 4, 4, 5, 6, 7, 0, 1, 2 };
	int len = sizeof(a) / sizeof(a[0]);
	vector<int> array(a, a + len);
	Solution s;
	cout << s.findMin(array);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值