Leetcode 154. Find Minimum in Rotated Sorted Array II

题目链接

问题描述

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.

解题思路

用二分查找的思路,因为在某个下标处前后两段Array对换,因此对换后的Array首元素必定比末尾元素要大。基于此可以判断Array中间元素与首元素的大小关系。假设首元素下标为start,末尾元素下标为end,中间元素下标为mid。

二分查找的while循环的判断条件为start<end 和 nums[start]>=nums[end];因为存在值相等的元素,因此如果简单的判断nums[start]>nums[end]则会出现对下一步的start和end边界判断错误的情况(如测例为[3,3,1,3])。

将nums[mid]与nums[start]比较,若nums[mid]>nums[start],则说明最小值处于[mid+1,end]区间;若nums[mid]==nums[start],则将start向后推一个下标;若nums[mid]<nums[start],则说明最小值处于[start,mid]区间。

代码如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值