温哥华Pinterest面试秘籍:LeetCode 154算法挑战与Python代码解析
大家好!最近在温哥华参加了Pinterest的面试,其中一道算法题让我印象深刻,那就是LeetCode 154题——寻找旋转排序数组中的最小值 II。 为了帮助大家更好地准备面试,我决定分享一下我的解题思路和Python代码。
这道题的难点在于数组可能包含重复元素,这使得简单的二分查找法失效。 传统的二分查找依赖于数组单调递增或递减的特性,而重复元素的存在打破了这种单调性。
我的解题策略是:改良的二分查找法。 关键在于处理重复元素的情况。 当 nums == nums
时,我们无法确定最小值在哪一边,所以只能将 right
指针向左移动一位,缩小搜索范围。 这虽然会略微降低效率,但在最坏情况下也能保证算法的正确性。
以下是我的Python代码实现:
def findMin(nums):
"""
:type nums: List
:rtype: int
"""
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums < nums:
right = mid
elif nums > nums:
left = mid + 1
else:
right -= 1 # Handle duplicates
return nums
代码解析:
left
和right
指针分别指向数组的左端和右端。- 循环条件是
left < right
,确保搜索范围有效。 mid
指向中间元素。- 三种情况:
nums < nums
:最小值在左半部分。nums > nums
:最小值在右半部分。nums == nums
:处理重复元素,将right
指针左移。
时间复杂度: 最坏情况下为O(n),平均情况下为O(log n)。
空间复杂度: O(1)
希望这个分享能够帮助到大家! 记住,准备面试的关键在于理解算法的原理,并能灵活运用。 祝大家面试顺利! 加油!
有任何问题,欢迎在评论区留言!