154寻找旋转排序数组中的最小值II

📃 题目描述

题目链接:寻找旋转排序数组中的最小值IIimage-20220126010606905

🔔 解题思路

和上题同理:数组特点有 nums[mid] < nums[right],最小值肯定在mid左边,nums[mid] > nums[right],最小值肯定在mid右边,但是 nums[mid] = nums[right]的时候,可能在左边也在右边,如[0,1,1,1,1]、[1,1,1,0,1],可以剪掉right

    int findMin(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        int mid;
        
        while (left < right) {
            mid = left + ((right - left) >> 1);
            if (nums[mid] > nums[right]) left = mid + 1;
            else if (nums[mid] < nums[right]) right = mid;
            else  right--;//证明左边都是同一个数字,可以砍掉最右的那个位置
        }

        return nums[left];
    }

💥 复杂度分析

  • 空间复杂度:o(logn)
  • 时间复杂度:O(1)
posted @ 2022-05-07 11:53  D-booker  阅读(25)  评论(0)    收藏  举报