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


    154. 寻找旋转排序数组中的最小值 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

    思路

    需要在无重复的旋转数组中注意一个地方:在middle 和 end 相等的时候,让 end 自减 1 即可;

    代码

    class Solution {
        public int findMin(int[] nums) {
                   if (nums == null || nums.length == 0)
                return 0;
    
            int start =0;
            int end = nums.length-1;
            //第一个数小于最后一个数,说明是完全升序
            if (nums[start]<nums[end])
                return nums[start];
    
            int middle=0;
            while (start<=end){
                 middle = start +(end-start)/2; //需要保证不能 int 相加出现溢出
    
                //让中位数和右边的数字比较
                if (nums[middle]>nums[end]){
                    start = middle+1;
                }
                //如果 end = middle-1 的话,不能通过 {3,1,2}
                else if (nums[middle]<nums[end]){
                    end = middle;//因为这里的 end 可能就是最小值,不能加一
                }
                //如果中间和最后相等。怎么查找,主要前后移动方向不确定
                //无法确定的时候,让 右边的值自减就好了
                else {
                    end--;
                }
            }
                return nums[start]; 
        }
    }
  • 相关阅读:
    关于学习方法
    ES6的异步操作
    Promise对象的基本用法
    Generator函数(三)
    Generator函数(二)
    Generator函数(一)
    ES6 Set结构和Map结构(上)
    mybatis02--增删改查
    myBatis01
    监听器
  • 原文地址:https://www.cnblogs.com/HuanChen1025/p/8999274.html
Copyright © 2020-2023  润新知