题目:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

示例 1:

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

输入:numbers = [2,2,2,0,1]
输出:0

提示:

  • n == numbers.length
  • 1 <= n <= 5000
  • -5000 <= numbers[i] <= 5000

numbers 原来是一个升序排序的数组,并进行了 1 至 n 次旋转
注意:本题与 力扣 154 题 相同:

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

参考 liweiwei1419的题解 ,感谢老师!

旋转数组的特点:

  • 多次旋转相当于一次旋转;
  • 旋转后的数组一分为二,一定为两段有序数组;
  • 数组中最大值喝最小值一定是相邻的:如果最大值右边存在值,那一定是最小值;
  • 如果两个数是上升趋势,那么两个数之间的数一定是上升的。

要满足【左边】小于【中间】,那么【左边】到【中间】的所有数字就都一定是全部属于连续上升趋势的,否则就不是一个旋转有序数组。

【中间值】与【左边】相比较? 还是【右边】,前提是比较的两者是连续上升的趋势

1.如果中间值与左边相比较,会存在以下两种情况:假设一共7个数

①[3,4,5,6,7,1,2],中间值为6,最小值在右边;

②[1,2,3,4,5,6,7],中间值为4,最小值在左边;

2.如果中间值与右边相比较,会存在以下三种情况:假设一共7个数

①[6,7,1,2,3,4,5],中间值为2,最小值在左边;

②[1,2,3,4,5,6,7],中间值为4,最小值在左边;

③[5,6,7,1,2,3,4],中间值为1也为最小值。

 综上最好比较:【中间值】与【右边】

还有一种特殊情况:【中间值】等于【右边】

比如:[2,2,1,2,2,2,2],[2,2,2,2,1,2,2],中间值为2,就需要一步一步去掉右边值。

代码:

 1 class Solution {
2 public int minArray(int[] numbers) {
3 int n = numbers.length;
4 if (n == 1) return numbers[0];
5 int left = 0, right = n-1;
6 while (left < right){
7 int mid = left + (right - left) / 2;
8 //mid不可能为最小值,下一轮搜索区间为[mid+1,right]
9 if (numbers[mid] > numbers[right]){
10 left = mid + 1;
11 }else if (numbers[mid] < numbers[right]){
12 //mid有可能就是最小值,下一轮搜索区间为[left,mid]
13 right = mid;
14 }else{
15 //中间值与右边值相等,只能去掉右边值,下一轮搜索区间为[left,mid]
16 right--;
17 }
18 }
19 //循环结束使,right == left,一定有答案
20 return numbers[left];
21 }
22 }

liweiwei的二分总结题解

liweiwei视频讲解二分查找

剑指offer11(Java)-旋转数组中的最小值(简单)的更多相关文章

  1. 《剑指offer》旋转数组中的最小数字

    本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...

  2. 【剑指Offer】旋转数组中的最小数字 解题报告(Python)

    [剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  3. 剑指offer——11旋转数组中最小的数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

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

    剑指Offer:旋转数组的最小数字[11] 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4 ...

  5. [剑指 Offer 11. 旋转数组的最小数字]

    [剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...

  6. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  7. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  8. 剑指offer35题:第一个只出现一次的字符+剑指offer55题:字符流中第一个不重复的字符+剑指offer51题:数组中重复的数字

    在看剑指offer的时候,感觉这三个题目很像,都是用哈希表可以解决,所以把这三个题整理出来,以供复习. 剑指offer35题:第一个只出现一次的字符 题目描述:在字符串中找出第一个只出现一次的字符.如 ...

  9. ⛅剑指 Offer 11. 旋转数组的最小数字

    20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...

  10. Leetcode 153.寻找旋转数组中的最小值

    寻找旋转数组中的最小值 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. ...

随机推荐

  1. python getOpenFileNames 获取文件实例解析

    一 概念 选取文件夹 QFileDialog.getExistingDirectory() 选择文件 QFileDialog.getOpenFileName() 选择多个文件 QFileDialog. ...

  2. Google Chart API学习(一)

    圆饼示例: <html> <head> <!--Load the AJAX API--> <script type="text/javascript ...

  3. FFmpeg命令行之ffmpeg

    一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...

  4. 阿里云centos Linux系统挂载数据盘操作流程

    这里假设的是已经在阿里云管理后台购买完了新增的硬盘.我们只讲在Linux系统里操作挂载硬盘过程. 一. 环境: 操作系统: Centos 7 二.查看云服务下所有硬盘 使用root账号登录服务器,执行 ...

  5. 用phpStudy配置apache服务器

    一:下载phpStudy 1进入官网https://www.xp.cn/download.html 选择稳定的2018版本 2执行下载好的文件,选择下载地址 注意!这里的安装路径不能有中文 3亮两个绿 ...

  6. RabbitMQ集群运维实践

    一.RabbitMQ的集群模式 主要有两种:普通集群模式和镜像队列模式.下面分别介绍这两种模式的原理: 1.普通集群模式: 在普通集群模式下,RabbitMQ的集群节点之间主要同步元数据,而不同步存储 ...

  7. 记录--通过手写,分析async await核心原理

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 async await 语法是 ES7出现的,是基于ES6的 promise和generator实现的 generator函数 在之 ...

  8. ElasticSearch中_source、store_fields、doc_values性能比较【转载】

    原文地址请点击 在这篇文章中,我想从性能的角度探讨ElasticSearch 为我们存储了哪些字段,以及在查询检索时这些字段如何工作.实际上,ElasticSearch和Solr的底层库Lucene提 ...

  9. async/await 致WPF卡死问题

    问题代码: xmal:一个按钮+一个显示框 1 <Button Width="100" Height="50" Margin="10" ...

  10. 6 CSS样式继承

    6 样式继承 CSS的样式表继承指的是,特定的CSS属性向下传递到子孙元素.总的来说,一个HTML文档就是一个家族,然后html元素有两个子元素,相当于它的儿子,分别是head和body,然后body ...