[LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值 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 a sorted array 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.
153. Find Minimum in Rotated Sorted Array 的拓展,这个题里允许有重复的元素。原来是依靠中间和边缘元素的大小关系,来判断哪一半是有序的。而现在因为重复元素的出现,如果遇到中间和边缘相等的情况,就无法判断哪边有序,因为哪边都有可能有序。假设原数组是{1,2,3,3,3,3,3},那么旋转之后有可能是{3,3,3,3,3,1,2},或者{3,1,2,3,3,3,3},判断左边缘和中心的时候都是3,就不知道应该截掉哪一半。解决的办法是对边缘移动一步,直到边缘和中间不在相等或者相遇,这就导致了会有不能切去一半的可能。所以最坏情况就会出现每次移动一步,总共移动n,算法的时间复杂度j: O(logn) ~ O(n)。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public int findMin( int [] num) { if (num == null || num.length== 0 ) return 0 ; int l = 0 ; int r = num.length- 1 ; int min = num[ 0 ]; while (l<r- 1 ) { int m = (l+r)/ 2 ; if (num[l]<num[m]) { min = Math.min(num[l],min); l = m+ 1 ; } else if (num[l]>num[m]) { min = Math.min(num[m],min); r = m- 1 ; } else { l++; } } min = Math.min(num[r],min); min = Math.min(num[l],min); return min; } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Solution( object ): def findMin( self , nums): """ :type nums: List[int] :rtype: int """ left, right = 0 , len (nums) - 1 while left < right: mid = left + (right - left) / 2 if nums[mid] = = nums[right]: right - = 1 elif nums[mid] < nums[right]: right = mid else : left = mid + 1 return nums[left] |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Solution2( object ): def findMin( self , nums): """ :type nums: List[int] :rtype: int """ left, right = 0 , len (nums) - 1 while left < right and nums[left] > = nums[right]: mid = left + (right - left) / 2 if nums[mid] = = nums[left]: left + = 1 elif nums[mid] < nums[left]: right = mid else : left = mid + 1 return nums[left] |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution { public : int findMin(vector< int > &nums) { if (nums.empty()) return 0; int left = 0, right = nums.size() - 1, res = nums[0]; while (left < right - 1) { int mid = left + (right - left) / 2; if (nums[left] < nums[mid]) { res = min(res, nums[left]); left = mid + 1; } else if (nums[left] > nums[mid]) { res = min(res, nums[right]); right = mid; } else ++left; } res = min(res, nums[left]); res = min(res, nums[right]); return res; } }; |
类似题目:
[LeetCode] 33. Search in Rotated Sorted Array 在旋转有序数组中搜索
[LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II
[LeetCode] 153. Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构