【问题描述】[简单]

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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

【解答思路】

1. 函数法

时间复杂度:O(N) 空间复杂度:O(1)

 public int minArray(int[] numbers) {Arrays.sort(numbers);return numbers[0];}
2. 二分法




时间复杂度:O(logN) 空间复杂度:O(1)

class Solution {public int minArray(int[] numbers) {int i = 0, j = numbers.length - 1;while (i < j) {int m = (i + j) / 2;if (numbers[m] > numbers[j]) i = m + 1;else if (numbers[m] < numbers[j]) j = m;else j--;}return numbers[i];}
}
3. 分治

二分的减治思想本来就是分治思想的特殊情况

时间复杂度:O(logN) 空间复杂度:O(1)

public class Solution {public int minArray(int[] numbers) {int len = numbers.length;if (len == 0) {return 0;}return minArray(numbers, 0, len - 1);}/*** 在子区间 [left, right] 里查找最小值** @param numbers* @param left* @param right* @return*/private int minArray(int[] numbers, int left, int right) {if (left == right) {return numbers[left];}int mid = (left + right) >>> 1;if (numbers[mid] > numbers[right]) {return minArray(numbers, mid + 1, right);} else if (numbers[mid] == numbers[right]) {return minArray(numbers, left, right - 1);} else {return minArray(numbers, left, mid);}}
}

【总结】

1.Arrays.sort()

1.1.Arrays.sort(int[] a)

1.2.Arrays.sort(int[] a , int fromIndex, int toIndex)

2. 二分法

中间 和两边对比 使用排除发减少范围

3. 二分的减治思想本来就是分治思想的特殊情况

转载链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/mian-shi-ti-11-xuan-zhuan-shu-zu-de-zui-xiao-shu-3/

参考链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/er-fen-jian-zhi-si-xiang-fen-zhi-si-xiang-by-liwei/

[剑指offer][JAVA]面试题第[11]题[旋转数组的最小数字][二分法][分治]相关推荐

  1. [剑指offer][JAVA]面试题第[21]题[调整数组顺序使奇数位于偶数面前][双指针]

    [问题描述][简单] 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.示例:输入:nums = [1,2,3,4] 输出:[1,3, ...

  2. [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

    [问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...

  3. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

    [问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...

  4. [剑指offer][JAVA]面试题第[34]题[二叉树中和为某一值的路径][回溯]

    [问题描述][中等] 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径.示例: 给定如下二叉树,以及目标和 sum = ...

  5. [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]

    [问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...

  6. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

  7. [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

    [问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...

  8. [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

    [问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...

  9. [剑指offer][JAVA]面试题第[46]题[把数字翻译成字符串][递归][逆推]

    [问题描述][中等] 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l", ...

最新文章

  1. 强化学习环境库 Gym 发布首个社区发布版,全面兼容 Python 3.9
  2. EAP-MD5认证暴力破解工具eapmd5pass
  3. android menu点击事件6,Android Menu
  4. python飞机大战简书_python中的小游戏——飞机大战
  5. DW1000 TX POWER (发射功率) 解析
  6. 4023-基于双向链表的双向冒泡排序法
  7. Linux 学习记录 二 (文件的打包压缩).
  8. 持久化数据结构(笔记)
  9. 矩池云上安装chumpy失败
  10. @Resource kdown
  11. hdoj1102 Constructing Roads(Prime || Kruskal)
  12. 紫金桥组态软件使用DF1协议与AB PLC通讯
  13. 数据平台作业调度系统详解-理论篇
  14. 开源网络教学平台SAKAI开发环境的搭建
  15. 网络型 PLC可编程控制器综合实训装置
  16. 80004005错误代码_0x80004005,手把手教你解决0x80004005错误代码的方法
  17. 面试问题 你如何评价你上一家公司,你觉的上一家公司怎么评价你
  18. superset详解(二)--sql工具箱
  19. 爬虫07 爬取阿里旅行特价机票
  20. 鸡尾酒问题,最小二乘法和范数的思考

热门文章

  1. 【干货分享】前端面试知识点锦集03(JavaScript篇)——附答案
  2. 在Google Maps 上点击标签后显示说明
  3. 软件工程导论课程主页 :12-13-2
  4. SharePoint中的权限体系
  5. 在Matlab2006a中如何创建.net组件
  6. 小强升职记梗概_时间管理法 ——《小强升职记》读书笔记 1
  7. 面试官:说一下List排序方法
  8. Android 倒计时——Timer和CountDownTimer的使用,实现启动,暂停,继续,重复,重设时长以及启动service后台倒计时
  9. 微信小程序 WXBizDataCrypt 解密 报错
  10. HBase shell命令行