文章目录

  • 11. 旋转数组的最小数字
    • 题目描述
    • 题目链接
    • 解题思路
    • 可以借助下图理解过程
    • 代码

11. 旋转数组的最小数字

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

题目链接

NowCoder

解题思路

将旋转数组对半分可以得到一个包含最小元素的新旋转数组,以及一个非递减排序的数组。新的旋转数组的数组元素是原数组的一半,从而将问题规模减少了一半,这种折半性质的算法的时间复杂度为 O(logN)(为了方便,这里将 log2N 写为 logN)。

        此时问题的关键在于确定对半分得到的两个数组哪一个是旋转数组,哪一个是非递减数组。我们很容易知道非递减数组的第一个元素一定小于等于最后一个元素。

通过修改二分查找算法进行求解(l 代表 low,m 代表 mid,h 代表 high):

1.当 nums[m] <= nums[h] 时,表示 [m, h] 区间内的数组是非递减数组,[l, m] 区间内的数组是旋转数组,此时令 h = m;
        2.否则 [m + 1, h] 区间内的数组是旋转数组,令 l = m + 1。

可以借助下图理解过程

代码

package 旋转数组的最小数字;
/*
作者     :XiangLin
创建时间 :05/03/2020 22:15
文件     :MINNUMBER.java
IDE      :IntelliJ IDEA
*/public class MINNUMBER {public int minNumberInRotateArray(int[] nums){if (nums.length == 0){return 0;}int l = 0;int h = nums.length - 1;while (l < h){int m = l + (h - l) / 2;if (nums[l] == nums[m] && nums[m] == nums[h]){return minNumber(nums,l,h);}else if (nums[m] <= nums[h]){h = m;}elsel = m + 1;}return nums[l];}private int minNumber(int[] nums ,int l ,int h){for (int i = l; i < h; i++){if (nums[i] > nums[i+1]){return nums[i+1];}}return nums[l];}public static void main(String[] args) {MINNUMBER nira = new MINNUMBER();int nums[] = {1,1,0,1};int n = nira.minNumberInRotateArray(nums);System.out.println(n);}
}


        如果数组元素允许重复,会出现一个特殊的情况:nums[l] == nums[m] == nums[h],此时无法确定解在哪个区间,需要切换到顺序查找。例如对于数组 {1,1,1,0,1},l、m 和 h 指向的数都为 1,此时无法知道最小数字 0 在哪个区间。

package 旋转数组的最小数字;
/*
作者     :XiangLin
创建时间 :05/03/2020 22:15
文件     :MINNUMBER.java
IDE      :IntelliJ IDEA
*/public class MINNUMBER {public int minNumberInRotateArray(int[] nums){if (nums.length == 0){return 0;}int l = 0;int h = nums.length - 1;while (l < h){int m = l + (h - l) / 2;if (nums[l] == nums[m] && nums[m] == nums[h]){return minNumber(nums,l,h);}else if (nums[m] <= nums[h]){h = m;}elsel = m + 1;}return nums[l];}private int minNumber(int[] nums ,int l ,int h){for (int i = l; i < h; i++){if (nums[i] > nums[i+1]){return nums[i+1];}}return nums[l];}public static void main(String[] args) {MINNUMBER nira = new MINNUMBER();int nums[] = {1,1,0,1};int n = nira.minNumberInRotateArray(nums);System.out.println(n);}
}


毕业后计划 my future plan
Everybody dreams about the future.There are many things waiting for us in the future,and sometimes I can’t wait to become an adult.I’m excited about my future because I have big hopes and dreams.

每个人都对未来抱有梦想。在未来有很多事情等待着我们,有时,我迫不及待地想成为成年人。我对自己的未来感到很兴奋因为我有很大的希望和梦想。

Here’s what I want to do.I plan to study hard bacause I want to go to a school overseas.My dream school is Harvard University.I might be a teacher,a doctor or a scientist.No matter what,I’ll be an expert at what I do so i can be useful to society.I want to be rich,too.I want to make a lot of money so my family will be proud of me.I also like to travel,so I want to visit every country and see the world.I hope to meet many people and make many friends.

这就是我想做的事情。我打算努力学习,因为我想去国外上学。哈佛大学是的我理想学校。我可能成为一个教师,医生或科学家。不管怎样,我会在我所工作的领域成为一个专家,这样我才可以对社会有用。我想是富裕。我想赚很多钱,我的家人会为我感到骄傲。我也喜欢旅游,所以我想访问的每一个国家并看看这个世界。我希望能与许多人成为朋友。

I am determined to make my dreams come true.I know it won’t be easy,but when I do make my dreams come true,I’ll be the happiest person in the world.

我下定决心让我的梦想成真。我知道这不容易,但当我实现我的梦想时我将会是世界上最幸福的人。

个人微信公众号,专注于学习资源、笔记分享,欢迎关注。我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活,,如果觉得有点用的话,请不要吝啬你手中点赞的权力,谢谢我亲爱的读者朋友

XiangLin
2020年3月6日于重庆城口
好好学习,天天向上,终有所获

11. 旋转数组的最小数字(剑指 Offer 题解Java版)相关推荐

  1. java剪绳子_14. 剪绳子(剑指 Offer 题解Java版)

    本文转载自[微信公众号:五角钱的程序员,ID:xianglin965]经微信公众号授权转载,如需转载与原文作者联系 文章目录 14. 剪绳子1. 题目链接2.题目描述3.解题思路3.1贪心3.2动态规 ...

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

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

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

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

  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. LeetCode-剑指 Offer 11. 旋转数组的最小数字

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

  9. 剑指offer:java版

    作者:CyC2018 链接:https 文章目录 一.基础 3.数组中的重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到头打印链表 7. 重建二叉树 8. 二叉树的下一个结点 9. 用 ...

最新文章

  1. php之判断点在多边形内的api
  2. MySQL bin-log 日志清理方式
  3. 框架 路由地址_Django框架的使用
  4. Rabbitmq - 配置
  5. java 中hashcode 与 equals的关系
  6. 95-136-040-源码-Operator-Operator简介
  7. 4G内存为什么会少800M
  8. 【OpenCV学习笔记】【函数学习】十九(感兴趣区域)
  9. Mac下如何修改IDEA的背景颜色
  10. 10.16作业 如鹏
  11. 2023年南开大学税务专硕考研上岸前辈备考经验指导
  12. 丹佛机场行李系统案例分析
  13. LeetCode 799 香槟塔[模拟+动态规划] HERODING的LeetCode之路
  14. 尚福林:建立集团诉讼和股东代表诉讼制度
  15. 解决电脑某个盘可用容量小于该盘总容量减去盘内所有文件大小总和
  16. 程序逸的Java项目之旅-图书管理系统之后端接口的快速实现
  17. BC26 计算三角形的周长和面积(海伦公式)
  18. Android开发技术前线 (android-tech-frontier) --优质技术文章的聚合项目
  19. CSS 属性:caret-color
  20. 数据结构与算法--递归(factorial)

热门文章

  1. java do while用法_Java do-while循环
  2. 德鲁克《卓有成效的管理者》学习笔记-掌握时间的学习和实践
  3. 01-邂逅React开发
  4. 电影推荐系统 python简书_【记录|Spark】简单的电影推荐系统
  5. k8s的网络插件kube-flannel.yml
  6. fama matlab源码_Matlab:计算Fama Macbeth方法的HAC(Newey West)标准误差
  7. MySQL like模糊匹配是否走索引
  8. 利用Python进行数据分析之金融数据的统计分析
  9. Linux内核4.14版本——alsa框架分析(8)-ASoC(Codec)
  10. redhat linux下安装jq和jq的简单应用