C++實現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二)
[LeetCode] 154. Find Minimum in Rotated Sorted Array II 尋找旋轉(zhuǎn)有序數(shù)組的最小值之二
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.
Example 1:
Input: [1,3,5]
Output: 1
Example 2:
Input: [2,2,2,0,1]
Output: 0
Note:
- This is a follow up problem to Find Minimum in Rotated Sorted Array.
- Would allow duplicates affect the run-time complexity? How and why?
這道尋找旋轉(zhuǎn)有序重復(fù)數(shù)組的最小值是之前那道 Find Minimum in Rotated Sorted Array 的拓展,當(dāng)數(shù)組中存在大量的重復(fù)數(shù)字時,就會破壞二分查找法的機制,將無法取得 O(lgn) 的時間復(fù)雜度,又將會回到簡單粗暴的 O(n),比如這兩種情況:{2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2} 和 {2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2},可以發(fā)現(xiàn),當(dāng)?shù)谝粋€數(shù)字和最后一個數(shù)字,還有中間那個數(shù)字全部相等的時候,二分查找法就崩潰了,因為它無法判斷到底該去左半邊還是右半邊。這種情況下,將右指針左移一位(或者將左指針右移一位),略過一個相同數(shù)字,這對結(jié)果不會產(chǎn)生影響,因為只是去掉了一個相同的,然后對剩余的部分繼續(xù)用二分查找法,在最壞的情況下,比如數(shù)組所有元素都相同,時間復(fù)雜度會升到 O(n),參見代碼如下:
解法一:
class Solution { public: int findMin(vector<int>& nums) { int left = 0, right = (int)nums.size() - 1; while (left < right) { int 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[right]; } };
跟之前那道 Find Minimum in Rotated Sorted Array 一樣,還是可以用分治法 Divide and Conquer 來解,不過寫法跟之前那道略有不同,只有在 nums[start] < nums[end] 的時候,才能返回 nums[start],等于的時候不能返回,比如 [3, 1, 3] 這個數(shù)組,或者當(dāng) start 等于 end 成立的時候,也可以直接返回 nums[start],后面的操作跟之前那道題相同,每次將區(qū)間 [start, end] 從中間 mid 位置分為兩段,分別調(diào)用遞歸函數(shù),并比較返回值,每次取返回值較小的那個即可,參見代碼如下:
解法二:
class Solution { public: int findMin(vector<int>& nums) { return helper(nums, 0, (int)nums.size() - 1); } int helper(vector<int>& nums, int start, int end) { if (start == end) return nums[start]; if (nums[start] < nums[end]) return nums[start]; int mid = (start + end) / 2; return min(helper(nums, start, mid), helper(nums, mid + 1, end)); } };
Github 同步地址:
https://github.com/grandyang/leetcode/issues/154
類似題目:
Find Minimum in Rotated Sorted Array
參考資料:
https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
到此這篇關(guān)于C++實現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)尋找旋轉(zhuǎn)有序數(shù)組的最小值之二內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析bitmap處理海量數(shù)據(jù)及其實現(xiàn)方法分析
本篇文章是對bitmap處理海量數(shù)據(jù)及其實現(xiàn)的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05