• 【剑指Offer】11.旋转数组的最小数字


    题目

    有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

    数据范围:1≤n≤10000,数组中任意元素的值: 0≤val≤10000

    要求:空间复杂度:O(1) ,时间复杂度:O(logn)

    示例1

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

    返回值:1

    示例2

    输入:[3,100,200,3]

    返回值:3

    解答

    源代码

    1. import java.util.*;
    2. public class Solution {
    3. /**
    4. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    5. *
    6. *
    7. * @param nums int整型一维数组
    8. * @return int整型
    9. */
    10. public int minNumberInRotateArray (int[] nums) {
    11. // write code here
    12. int left = 0, right = nums.length - 1;
    13. while (left < right) {
    14. int mid = (left + right) / 2;
    15. if (nums[mid] > nums[right]) {
    16. left = mid + 1;
    17. } else if (nums[mid] < nums[right]) {
    18. right = mid;
    19. } else {
    20. right--;
    21. }
    22. }
    23. return nums[left];
    24. }
    25. }

    总结

    时间复杂度为O(logn),那就是要使用二分法。找出数组最小值,也就是旋转前的第一个元素,即旋转数组的旋转点。

    1、初始化left、right双指针指向数组两端;

    2、当left < right时,进行循环,每次循环找出中间点mid = (left + right) / 2,对比下标mid和right对应的元素大小;

    3、如果nums[mid] > nums[right],说明mid在左部分,left = mid + 1;

    4、如果nums[mid] < nums[right],说明mid在右部分,right = mid;

    5、如果nums[mid] = nums[right],right减一,缩小范围。

  • 相关阅读:
    【计算机网络笔记一】网络体系结构
    【C++】继承(定义、菱形继承、虚拟继承)
    大中型园区网络拓扑架构
    浅谈EDR绕过
    MySQL事务和锁
    自动化信息收集工具 水泽 使用教程
    Python小技巧:bytes与str的区别
    Ansible stat模块 stat模块 – 检索文件或文件系统状态
    单片机通信总述——理论部分(CAN、串口、SPI、I2C等)
    100-150
  • 原文地址:https://blog.csdn.net/qq_57438473/article/details/133543931