11. 旋转数组的最小数字
链接
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. 旋转数组的最小数字相关推荐
- 《LeetCode力扣练习》剑指 Offer 11. 旋转数组的最小数字 Java
<LeetCode力扣练习>剑指 Offer 11. 旋转数组的最小数字 Java 一.资源 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 ...
- 剑指 Offer 11. 旋转数组的最小数字 简单
剑指 Offer 11. 旋转数组的最小数字 题目 解题思路 方法(一)直接遍历法 方法(二)二分查找法 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组 ...
- LeetCode-剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 11. 旋转数组的最小数字 思路一:先排序,返回第一个数组值 class Solution {public:int minArray(vector<int>& n ...
- 剑指offer 11. 旋转数组的最小数字(很详细!)
剑指offer 11. 旋转数组的最小数字 题目 解题思路 代码 题目 解题思路 一开始,我们就能直接想到,数组找最小值,那么不轻轻松松直接遍历一遍,用一个变量记录最小值,然后直接返回不就完事了? 但 ...
- 【LeetCode】剑指 Offer 11. 旋转数组的最小数字
[LeetCode]剑指 Offer 11. 旋转数组的最小数字 文章目录 [LeetCode]剑指 Offer 11. 旋转数组的最小数字 一.遍历 二.二分法 总结 一.遍历 算法步骤: 遍历数组 ...
- 【剑指 Offe】11. 旋转数组的最小数字
题目:剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数 ...
- 【剑指 Offe】剑指 Offer 11. 旋转数组的最小数字
目录标题 算法汇总 题目 关键点 代码 1.解体方法 - 二分法 思路 代码 时间和空间复杂度 2.解题方法,如暴力法 思路 代码 时间和空间复杂度 算法汇总 以下是所有算法汇总,包括GitHub源码 ...
- 11. 旋转数组的最小数字(剑指 Offer 题解Java版)
文章目录 11. 旋转数组的最小数字 题目描述 题目链接 解题思路 可以借助下图理解过程 代码 11. 旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. ...
- 剑指offer:面试题11. 旋转数组的最小数字
题目:旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2, ...
- 剑指offer——11.旋转数组的最小数字
题目: 题1:实现快速排序 题2:年龄排序问题. 题3:旋转数组的最小数字 知识点: 快速排序算法,参考:https://blog.csdn.net/shujuelin/article/details ...
最新文章
- 在商业中,如何与人工智能建立共生关系?
- C# 快捷键/hotkey简单例子
- 程序员熬夜写代码,用C/C++打造一个安全的即时聊天系统
- “3+3”看华为云FusionInsight如何引领“数据新基建”持续发展
- webstorm怎么建php文件夹,webstorm怎么创建css
- 某物流集团企业信息化案例介绍
- spring boot log4j2与三方依赖库log4j冲突无法初始化问题解决方法
- JS学习总结(14)——Events事件
- winpe 卡巴斯基本升级内部错误
- 邮件服务器的功能以及相关工作原理
- 机器学习模型的保存与调用
- 游戏引擎 Unity 的入门易精通难体现在哪?为什么?
- python 如何爬虫wind api数据_Python网络爬虫实战之十:利用API进行数据采集
- kettle多数据合并
- 荣耀android手机怎么截图,华为荣耀畅玩5C怎么截图/截屏方法教程
- 2017ife_yaoyao学院_task1
- mysql 取分组数据的前几名(1)
- 计算机进制、内存模块详讲-入门必看(超详细)
- 海豚客服系统接入技巧分享:微信端和网页端
- opencv案例: 车辆检测