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

發佈了42 篇原創文章 · 獲贊 0 · 訪問量 3505
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章