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];
	}
};

猜你喜欢

转载自blog.csdn.net/sysu_chan/article/details/79554347
今日推荐