154. Find Minimum in Rotated Sorted Array II & 153. Find Minimum in Rotated Sorted Array

本文介绍了一种在旋转过的有序数组中寻找最小值的方法,特别考虑了数组中可能存在的重复元素。通过二分查找法,文章详细解释了如何有效地找到最小值,并提供了具体的实现代码。

Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

The array may contain duplicates.

Subscribe to see which companies asked this question.


找出经过旋转后的有序数组中的最小值。154题和153题是差不多的,只不过是154题允许出现重复的数,而153题不允许。直接解决154题就能解决153题了!用二分法搜索最小值。可以发现旋转之后是分为两个升序部分的。拿mid对应的值与当前子序列的尾部值对比(子序列由left和right索引值确定),如果是大于关系,说明了最小值肯定实在第二部分,而且不在mid处,所以令left=mid+1;如果是小于关系,说明最小值在第一部分,也有可能在mid处,所以令right=mid;如果是相等关系,那就难说了,有可能是类似“0111”和“7111”这两种情况,但left和right总是要改变的不然就无限循环了,可以发现right--总是对的,所以就right--好了。最后返回nums[mid]即可。


代码:

class Solution {
public:
	int findMin(vector<int>& nums)
	{
		int left = 0, right = nums.size()-1, mid;
		while(left < right)
		{
			mid = left + (right - left) / 2;
			if(nums[mid] > nums[right])
			{
				left = mid + 1;
			}
			else if(nums[mid] < nums[right])
			{
				right = mid;
			}
			else
			{
				right--;
			}
		}
		return nums[left];
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值