154. 寻找旋转排序数组中的最小值 II(python3)

题目:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

注意数组中可能存在重复的元素。

示例 1:

输入: [1,3,5]
输出: 1
示例 2:

输入: [2,2,2,0,1]
输出: 0
说明:

这道题是 寻找旋转排序数组中的最小值 的延伸题目。
允许重复会影响算法的时间复杂度吗?会如何影响,为什么?

 

解题思路:

二分查找,每次二分点两边一定有一边是有序的(或值全相同),用key记录最小数,每次用key与有序边的最小值相比,最终得到结果。
此题需注意存在重复元素,每次比较nums[mid]与nums[start]或nums[end],如相等则start++或end--舍去相同值。key需在此处与nums[mid]对比,如nums[mid]小则更新,否则会出现[1,3,5],当mid、start、end都指向下标0时key没被记录就跳出循环的情况。

 

代码:

import sys

class Solution:
    def findMin(self, nums: List[int]) -> int:
        start = 0
        end = len(nums) - 1
        
        key = sys.maxsize
        while(start <= end):
            mid = start + (end - start) // 2

            if(nums[start] == nums[mid]):
                if(key > nums[mid]):
                    key = nums[mid]
                start = start + 1
            elif(nums[end] == nums[mid]):
                if(key > nums[mid]):
                    key = nums[mid]
                end = end - 1

            elif(nums[mid] < nums[end]):
                if(key > nums[mid]):
                    key = nums[mid]
                end = mid - 1

            else:
                if(key > nums[start]):
                    key = nums[start]
                start = mid + 1

                
        
        return key

 

测试用例:

if __name__=="__main__":
    nums = [2,2,2,0,1]
    res = Solution().findMin(nums)
    print(res)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Python语言中的内置函数`min()`来找出数组中最小值,然后使用`index()`方法来获取此最小值数组中的下标。 ```python def find_min_and_index(arr): min_value = min(arr) # 找出数组中最小值 min_index = arr.index(min_value) # 获取最小值数组中的下标 return min_value, min_index # 测试代码 arr = [5, 2, 9, 3, 7, 1] min_value, min_index = find_min_and_index(arr) print("最小值为:", min_value) print("最小值的下标为:", min_index) ``` 以上代码中,`find_min_and_index()`函数接受一个数组作为参数,使用`min()`函数找出数组中最小值,然后使用`index()`方法获取最小值数组中的下标。最后返回最小值和下标。 对于给定的数组`arr = [5, 2, 9, 3, 7, 1]`,输出结果为: ``` 最小值为: 1 最小值的下标为: 5 ``` 这样就得到了数组中最小值和其对应的下标。 ### 回答2: 在Python中,可以使用内置函数`min()`来找出数组中最小值。同时,可以使用内置方法`index()`来找出最小值数组中的下标。下面是一个例子: ```python arr = [5, 3, 2, 7, 9, 1, 4] min_value = min(arr) # 使用min()找到最小值 min_index = arr.index(min_value) # 使用index()找到最小值数组中的下标 print("数组中最小值为:", min_value) print("最小值的下标为:", min_index) ``` 上述代码输出的结果为: ``` 数组中最小值为: 1 最小值的下标为: 5 ``` 在这个例子中,数组`arr`中的最小值是1,它的下标是5。 ### 回答3: Python可以使用以下代码来找出数组中最小值和其下标: ```python def find_min(arr): min_value = float('inf') # 将最小值设为无穷大 min_index = 0 # 将最小值的下标设为0 for i in range(len(arr)): if arr[i] < min_value: # 如果当前元素小于最小值 min_value = arr[i] # 更新最小值 min_index = i # 更新最小值的下标 return min_value, min_index arr = [5, 2, 8, 1, 9] min_val, min_idx = find_min(arr) print("最小值:", min_val) print("最小值的下标:", min_idx) ``` 以上代码定义了一个`find_min`函数,它接受一个数组作为参数,并返回最小值最小值的下标。在函数内部,使用`float('inf')`将`min_value`初始化为无穷大,将`min_index`初始化为0。使用循环遍历数组,如果当前元素小于最小值,则更新`min_value`和`min_index`。最后,返回最小值最小值的下标。 在主程序中,我们定义了一个数组`arr`,然后调用`find_min`函数来找出最小值最小值的下标。最后,输出最小值最小值的下标。对于输入的`arr`数组,输出的结果将会是最小值为1,最小值的下标为3。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值