链接

https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/
难度: #简单

题目

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

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [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

注意:本题与主站 154 题相同:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/

代码框架

class Solution {public int minArray(int[] numbers) {}
}

题目解析

解答思路1:
暴力解法,
查看数组的每一个元素和前一个元素的关系,
如果比前一个小,
则确定是最小的元素。

解答思路2:
观察发现,可以使用二分思想,
将数组从最小值的地方分成左右两部分,
左边数组是递增序列,
右边数组也是递增序列,
使用二分思想进行查找,
找到中间值和最右边的元素比较,
如果中间值小于最右边元素,
说明右半边有序,则最小值出现在左半边部分,
如果中间值大于最右侧元素,
说明最小值出现在右半边部分,
因为存在最小值,打破了递增序列,
需要利用二分思想进一步在可能的半边查找。
如果中间值等于最右侧元素,
说明存在重复的元素,无法进一步判断最小值的范围,
可以去掉重复元素,缩小查找范围。

测试用例

package edu.yuwen.sowrd.num11.solution;import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;import edu.yuwen.sowrd.num11.sol2.Solution;public class SolutionTest {/*** 输入:[3,4,5,1,2]* 输出:1*/@Testpublic void testCase1() {Solution solution = new Solution();int[] numbers = { 3, 4, 5, 1, 2 };int min = solution.minArray(numbers);Assertions.assertEquals(1, min);}/*** 输入:[2,2,2,0,1]* 输出:0*/@Testpublic void testCase2() {Solution solution = new Solution();int[] numbers = { 2, 2, 2, 0, 1 };int min = solution.minArray(numbers);Assertions.assertEquals(0, min);}/*** 输入:[3,1,3,3]* 输出:1*/@Testpublic void testCase3() {Solution solution = new Solution();int[] numbers = { 3, 1, 3, 3 };int min = solution.minArray(numbers);Assertions.assertEquals(1, min);}
}

解答1

package edu.yuwen.sowrd.num11.sol1;public class Solution {public int minArray(int[] numbers) {for (int i = 1; i < numbers.length; i++) {if (numbers[i - 1] > numbers[i]) {return numbers[i];}}// 找不到比第一个元素小的,则第一个元素是最小值return numbers[0];}
}

解答2 推荐

package edu.yuwen.sowrd.num11.sol2;public class Solution {public int minArray(int[] numbers) {int low = 0;int high = numbers.length - 1;// 注意这里的退出条件while (low < high) {int mid = low + (high - low) / 2;int mNum = numbers[mid];int rNum = numbers[high];// 是递增序列,则查找左半边部分if (mNum < rNum) {high = mid;}// 不是递增序列,则查找右半边部分else if (mNum > rNum) {low = mid + 1;}// 如果存在重复元素则排除掉,再重新查找else {high--;}}return numbers[low];}
}

http://www.taodudu.cc/news/show-1250932.html

相关文章:

  • 50. 第一个只出现一次的字符
  • 32 - I. 从上到下打印二叉树
  • 32 - II. 从上到下打印二叉树 II
  • 32 - III. 从上到下打印二叉树 III
  • 26. 树的子结构
  • PostgreSQL数据库密码
  • SpringBoot中使用Hibernate Validator校验工具类
  • 28. 对称的二叉树
  • 解决tomcat的undeploy
  • 解决eclipse出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
  • 下载安装neo4j
  • vue-drag-resize实线页面的拖拽与缩放
  • 解决IDEA不能编译XML文件
  • 播放视频和音频文件java
  • 实时获取屏幕大小
  • vue部分样式无法修改
  • vue中根据搜索内容跳转到页面指定位置
  • Duplicate entry ‘‘ for key ‘***‘
  • transferto遇到的问题java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp
  • Spring的jar包下载
  • *** is required and cannot be removed from the server
  • Tomcat 服务器介绍和使用
  • 第一个 Web 程序
  • Servlet 介绍
  • 集成 Tomcat、 Servlet 的生命周期
  • Request 对象、重定向、请求转发
  • Cookie 学习
  • ServletContext对象、ServletConfig对象
  • sevlet中web.xml 文件
  • 过滤器、监听器

11. 旋转数组的最小数字相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 11. 旋转数组的最小数字 Java

    <LeetCode力扣练习>剑指 Offer 11. 旋转数组的最小数字 Java 一.资源 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 ...

  2. 剑指 Offer 11. 旋转数组的最小数字 简单

    剑指 Offer 11. 旋转数组的最小数字 题目 解题思路 方法(一)直接遍历法 方法(二)二分查找法 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组 ...

  3. LeetCode-剑指 Offer 11. 旋转数组的最小数字

    剑指 Offer 11. 旋转数组的最小数字 思路一:先排序,返回第一个数组值 class Solution {public:int minArray(vector<int>& n ...

  4. 剑指offer 11. 旋转数组的最小数字(很详细!)

    剑指offer 11. 旋转数组的最小数字 题目 解题思路 代码 题目 解题思路 一开始,我们就能直接想到,数组找最小值,那么不轻轻松松直接遍历一遍,用一个变量记录最小值,然后直接返回不就完事了? 但 ...

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

    [LeetCode]剑指 Offer 11. 旋转数组的最小数字 文章目录 [LeetCode]剑指 Offer 11. 旋转数组的最小数字 一.遍历 二.二分法 总结 一.遍历 算法步骤: 遍历数组 ...

  6. 【剑指 Offe】11. 旋转数组的最小数字

    题目:剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数 ...

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

    目录标题 算法汇总 题目 关键点 代码 1.解体方法 - 二分法 思路 代码 时间和空间复杂度 2.解题方法,如暴力法 思路 代码 时间和空间复杂度 算法汇总 以下是所有算法汇总,包括GitHub源码 ...

  8. 11. 旋转数组的最小数字(剑指 Offer 题解Java版)

    文章目录 11. 旋转数组的最小数字 题目描述 题目链接 解题思路 可以借助下图理解过程 代码 11. 旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. ...

  9. 剑指offer:面试题11. 旋转数组的最小数字

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

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

    题目: 题1:实现快速排序 题2:年龄排序问题. 题3:旋转数组的最小数字 知识点: 快速排序算法,参考:https://blog.csdn.net/shujuelin/article/details ...

最新文章

  1. 在商业中,如何与人工智能建立共生关系?
  2. C# 快捷键/hotkey简单例子
  3. 程序员熬夜写代码,用C/C++打造一个安全的即时聊天系统
  4. “3+3”看华为云FusionInsight如何引领“数据新基建”持续发展
  5. webstorm怎么建php文件夹,webstorm怎么创建css
  6. 某物流集团企业信息化案例介绍
  7. spring boot log4j2与三方依赖库log4j冲突无法初始化问题解决方法
  8. JS学习总结(14)——Events事件
  9. winpe 卡巴斯基本升级内部错误
  10. 邮件服务器的功能以及相关工作原理
  11. 机器学习模型的保存与调用
  12. 游戏引擎 Unity 的入门易精通难体现在哪?为什么?
  13. python 如何爬虫wind api数据_Python网络爬虫实战之十:利用API进行数据采集
  14. kettle多数据合并
  15. 荣耀android手机怎么截图,华为荣耀畅玩5C怎么截图/截屏方法教程
  16. 2017ife_yaoyao学院_task1
  17. mysql 取分组数据的前几名(1)
  18. 计算机进制、内存模块详讲-入门必看(超详细)
  19. 海豚客服系统接入技巧分享:微信端和网页端
  20. opencv案例: 车辆检测

热门文章

  1. 微擎框架小程序 入口
  2. 条款01:视C++为一个语言联邦
  3. css:before和after中的content属性
  4. uestc Palindromic String
  5. PostgreSQL的 create index concurrently
  6. Javascript中char和int的互相转换的代码(转载)
  7. 【转】单元测试基础知识
  8. Nodejs Set和Map的使用
  9. PHP 文件与目录操作
  10. JavaScript学习笔记(九)--内置函数