【二分查找】153. 寻找旋转排序数组中的最小值

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

解题思路

  • 改造二分查找算法
  • 中间值大于两端 那么说明最小值在中间值的右边 left = mid + 1
  • 中间值小于两端 说明最小值在中间值的左边 right = mid - 1
  • 如果中间值介于左右两端之间 说明此时进入的有序子序列 right = mid
class Solution {
    public int findMin(int[] nums) {
        // 改造二分查找算法
        
        // 中间值大于两端 那么说明最小值在中间值的右边 left = mid + 1
        // 中间值小于两端  说明最小值在中间值的左边 right = mid - 1

        // 如果中间值介于左右两端之间  说明此时进入的有序子序列 right = mid

        int left = 0;
        int right = nums.length - 1;
         int mid = left + (right - left) / 2;

        // 4 4 5 1 2 3
        while(left <= right){
            mid = left + (right - left) / 2;

            if(nums[mid] >= nums[left] && nums[mid] >= nums[right]){
                // 如果中间值大于两端的值   mid 指向的元素不可能是最小值
                left = mid + 1;
            }else if(nums[mid] <= nums[left] && nums[mid] <= nums[right]){
                // 如果中间值小于两端的值  那么mid指向的元素 可能就是最小值
                right = mid;
            }else if(nums[mid] > nums[left] && nums[mid] < nums[right]){
                right = mid - 1;// 最小值在 左边
            }
        }

        return nums[mid];
    }
}

你可能感兴趣的:(#,Leetcode,算法,数据结构,排序算法)