HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

    • 【中级】12k-26k档

      • JVM进阶

      • Java进阶

      • MySQL

      • 中间件

      • 算法

        • 1-两数之和
        • 高频算法面试题
        • 2两数相加
        • 09-用两个栈实现一个队列
        • 11-盛水最多的容器
        • 19-删除链表的倒数第N个结点
        • 20-有效的括号
        • 22-括号生成
        • 39-组合总和
        • 46-全排列
        • 53-连续最大子序和
        • 64匹马,只有8个赛道,挑选出最快的4匹马
        • 70-爬楼梯
        • 136-只出现一次的数字
        • 141环形链表
        • 206-翻转链表
        • 234回文链表
        • 387-字符串中的第一个唯一字符
        • 543二叉树最大直径
        • 八大排序算法
        • 剪绳子
        • 旋转数
        • 模板
        • 求解立方根不使用库函数
      • 高阶

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【中级】12k-26k档
  • 算法
#旋转数
码农阿雨
2022-06-02
目录

旋转数

据说这是一道腾讯的面试题。

# 描述:

原意:

 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
 
例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为 1。

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


 示例 2:
 输入:[2,2,2,0,1]
 输出:0

人话:

题目花里胡哨的,其实一句话说完,就是找到这个数组的最小值。

# 思路:

  • 暴力法

暴力法很简单,遍历数组,选择一个元素,再和每一个元素进行比较。

但是这种时间复杂度是 O(n)

  • 二分查找

题目说到数组是递增排序的,既然是‘有序’的,那可以使用二分查找。

二分查找的核心:选择一个中间数,依次比较即可。

时间复杂度是 O(logn)

public class 腾讯旋转数 {
    public static void main(String[] args) {
        int[] nums = new int[]{3, 4, 5, 1, 2};
        System.out.println(minArray(nums));

    }

    public static int minArray(int[] numbers) {
        //下标
        int start = 0;
        int end = numbers.length - 1;

        /**
         *           mid到end ,
         *         1. 递增,mid<end,肯定在左边    12345
         *         2. 递减,mid>end,肯定在右边    34512
         *         3. ==的时候,mid = end , 不能确定    12223 , 32221
         */
        while (start < end) {
            //中间的数
            int mid = (start + end) / 2;
            //如果最后的数大于中间的数,那么这是个递增的数,那么最小的数肯定是在左边
            if (numbers[mid] < numbers[end]) {
                //
                end = mid;
            }
            if (numbers[mid] > numbers[end]) {
                start = mid + 1; //要加 1 噢
            }
            //没办法了,只能暴力获取了
            if (numbers[mid] == numbers[end]) {
                int result = getMinResult(start, end, numbers);
                return result;
            }
        }
        return numbers[start];
    }

    /**
     * 获取数组最小的值
     * @param start
     * @param end
     * @param nums
     * @return
     */
    public static int getMinResult(int start, int end, int[] nums) {
        int min = nums[start];
        for (; start < end; start++) {
            if (min > nums[start]) {
                min = nums[start];
            }
        }
        return min;
    }
}
阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#旋转数
上次更新: 2026-03-28 17:00:16
最近更新
01
MySQL支持的锁有哪些
03-28
02
HTTP 是不保存状态的协议, 如何保存用户状态
03-28
03
用户态和内核态的区别
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2026 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式