解题思路:

针对旋转数组的特点,即旋转后,数组的前半部分是有序的,后半部分是有序的。

1.先考虑一般情况:可以参考二分查找的思想,在数组中设置两个指针,一个指向数组的起始位置,一个指向数组的结束位置。随后依据这两个位置求出数组的中间位置mid。如果mid指向元素大于等于start指向元素,则证明mid肯定在数组的前半部分,而旋转数组的最小值在mid的后面,因此可以缩小查找范围,令start = mid;如果mid指向元素小于start指向元素并且小于等于end指向指向元素,则证明mid肯定在数组的后半部分,而最小值在mid之前或者就是mid指向的元素,因此可以缩小查找范围,令end = mid。直到end - start == 1为止,此时end指向的元素即为旋转数组的最小值。

2.本题还需考虑两种特殊情况:(1)若是这样的旋转数组,即先赚前面的0个元素到后面,即数组还是一开始的排序数组,那么数组中的第一个数字即为最小的元素;(2)当start和end和mid指向元素相同时,此时无法判断mid所指元素属于前半部分还是后半部分,因此只能进行顺序查找。

public class Solution {/*** 利用二分查找完成寻找最小的元素* * @param array* @return*/public int minNumberInRotateArray(int[] array) {// 初始化数组的启示索引和结束索引int firstIndex = 0;int lastIndex = array.length - 1;int midIndex = firstIndex;// 旋转数组中一般情况下第一个元素是大于等于最后一个元素的// 而如果数组中第一个数字小于最后一个数字,表明该数组本身是排序的,即相当于旋转了前0个元素到后面while (array[firstIndex] >= array[lastIndex]) {if (lastIndex - firstIndex == 1) {midIndex = lastIndex;break;}// 求出中间位置的索引midIndex = (firstIndex + lastIndex) / 2;// 如果第一个指针和第二个指针和第三个指针指向的三个数字相等,则只能顺序查找if (array[firstIndex] == array[lastIndex] && array[midIndex] == array[firstIndex]&& array[midIndex] == array[lastIndex]) {return minInOrder(array, firstIndex, lastIndex);}if (array[midIndex] >= array[firstIndex]) {// 此时说明中间元素处于左边这个子数组中,而最小的元素位于中间元素的后面// 将第一个指针指向该中间元素,该指针仍然位于前面这个递增子数组中firstIndex = midIndex;} else if (array[midIndex] <= array[lastIndex]) {// 如果中间元素位于右边的递增子数组,则它所指向元素应该小于等于第二个指针指向的元素// 此时最小的元素在该中间元素的前面,移动之后的第二个指针仍然在第二个递增子数组中lastIndex = midIndex;}}// 此时第二个指针指向的元素即为旋转数组中最小的元素return array[lastIndex];}private int minInOrder(int[] array, int firstIndex, int lastIndex) {int minNum = array[firstIndex];for (int i = firstIndex + 1; i <= lastIndex; i++) {if (array[i] < minNum) {minNum = array[i];}}return minNum;}
}

剑指offe面试题8 旋转数组的最小数字 (java实现)相关推荐

  1. 剑指offer面试题[8]-旋转数组的最小数字

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

  2. 剑指Offer - 面试题11. 旋转数组的最小数字(二分查找)

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

  3. 剑指offer面试题11. 旋转数组的最小数字(二分查找)

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

  4. 剑指offer(12)旋转数组的最小数字

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

  5. 【剑指offer-Java版】08旋转数组的最小数字

    旋转数组最小数字:暴力方法就是遍历-有效的方法是二分,但是存在失效的情况 几个特别的测试用例需要注意下: 数组中含有多个相同的数字 最小数字就是第一个 public class _Q08 {publi ...

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

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

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

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

  8. 【剑指offer】面试题11:旋转数组的最小数字(java)

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

  9. 面试题11. 旋转数组的最小数字

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

最新文章

  1. [摘]终于找到一个有助理解left/right/full outer join的例子
  2. 利用废弃建筑建设数据中心
  3. Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除
  4. Nginx负载均衡状态之backup
  5. 英伟达DALI加速技巧:让数据预处理速度比原生PyTorch快4倍
  6. Tomcat 配置https证书
  7. linux夸分区建立软链接,Linux硬链接和软链接
  8. spring-第六篇之创建bean的3种方式
  9. SQL 数据表基本操作
  10. 用CIL写程序:从“call vs callvirt”看方法调用
  11. android中TextView属性之autoText解析
  12. 25G差分信号对内等长相差太大怎么处理?在哪里绕好一点
  13. Check Point R80.10 SmartConsole汉化生成中文报表
  14. vue 修改模板{{}}标签_Vue模板语法
  15. matlab水印提取
  16. linux解压rar.gz,Linux tar.gz 、zip、rar 解压 压缩命令
  17. 淘宝数据可视化大屏案例(Hadoop实验)
  18. APUE-文件和目录(六)函数ftw和nftw
  19. 记录seata初踩坑
  20. 找出知晓秘密的所有专家(leetcode 2092)

热门文章

  1. 《此生,若你安好.便是晴天》 -- @ShinePug
  2. 微信广告转化统计java,百度推广oCPC微信号复制转化次数统计系统数据接口
  3. flash cs3 键盘ASCII编码
  4. Allegro创建区域规则
  5. 【HNOI模拟By lyp】Day1
  6. 什么是幂等?如何实现
  7. 水处理设备网关,生活污水处理设备网关。
  8. 李元翼 梧里 徒死無益
  9. 使用大华NetSDK对接大华相机
  10. 用计算机画画的意义,浅谈电脑绘画在美术教学中的意义.doc