美文网首页
leetcode--153--寻找旋转排序数组中的最小值

leetcode--153--寻找旋转排序数组中的最小值

作者: minningl | 来源:发表于2020-07-18 01:18 被阅读0次

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

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

请找出其中最小的元素。

你可以假设数组中不存在重复元素。

示例 1:

输入: [3,4,5,1,2]
输出: 1

示例 2:

输入: [4,5,6,7,0,1,2]
输出: 0

链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array

思路:
1、二分查找,设置好边界条件向中间逼近,直至找到最小的节点
2、需要注意的边界条件:
a)循环的边界条件,为什么不是left<=right? 如果相等,则假如此时left、right已经走到最小值对应位置,则此时继续往下循环的话,会进入else条件中,使得left+1,跳到非最小值索引的位置
b)为什么right=mid?而不是mid-1。因为此时mid在右侧递增的序列,假如此时mid在最小的位置,则mid-1的话就会走向左侧的序列中

Python代码:

class Solution(object):
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

        left = 0
        right = len(nums)-1

        while left<right:
            # 为什么循环条件里没有等号?
            mid = (left+right)/2
            if nums[mid]<nums[right]:
                right = mid  
                # 为什么不等于mid-1? 
            else:
                left = mid+1
        return nums[left]
                

C++代码:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left=0;
        int right=nums.size()-1;

        while (left<right){
            int mid=(left+right)/2;
            if(nums[mid]<nums[right]){
                right = mid;
            }else{
                left = mid+1;
            }
        }
        return nums[left];
    }
};

Java代码:

class Solution {
    public int findMin(int[] nums) {
        if (nums.length==1){
            return nums[0];
        }
        int left=0;
        int right=nums.length-1;

        while (left<right){
            int mid = (left+right)/2;
            if (nums[mid]>nums[right]){
                left = mid+1;
            }else{
                right = mid;
            }
        }
        return nums[right];
    }
}

相关文章

网友评论

      本文标题:leetcode--153--寻找旋转排序数组中的最小值

      本文链接:https://www.haomeiwen.com/subject/xstahktx.html