题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

一 . 方法分析(正常单调递增数组)

1 . 参考二分查找法,我们用两个指针分别指向数组的第一个元素和最后一个元素。

  2 . 基于二分查找法的概念,找到数组中间的元素:因为该题目是查找旋转数组中的最小值。

如果该中间元素位于前面的递增子数组,那么它应该大于或者等于第一个指针指向的元素。此时数组中最小的元素应该位于该中间元素的后面。我们可以把第一个指针指向该中间元素,这样可以缩小寻找的范围。移动之后的第一个指针仍然位于前面的递增子数组之中。

如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指向的元素。此时该数组中最小的元素应该位于该中间元素的前面。

  3 . 接下来我们再用更新之后的两个指针,重复做新一轮的查找。

可参考下例:

1. 确定Pmid为5,Pmid>P1且Pmid>P2,说明P1到Pmid为单增。

2. 把Pmid定义为P1,新的Pmid为1,这时候Pmid<P1且Pmid<P2,说明Pmid到 P2是单增,把新的Pmid定义为P2。

3. 这时候P1>P2,且位置相差为1,结束,得出最小数为P2。

二 . 特殊条件

1 . 鲁棒判断:即数组长度为0或者为空数组时,应返回0.

2 . 存在相等的数。

例:

1. 有重复数字,并且重复的数字刚好的最小的数字。    { 3, 4, 5, 1, 1, 2 }

2. 有重复数字,但重复的数字不是第一个数字和最后一个数字。   { 3, 4, 5, 1, 2, 2 }

3. 单调升序数组,旋转0个元素,也就是单调升序数组本身。{ 1, 0, 1, 1, 1 }

4. 数组中只有一个数字。{ 1 }

适当的采用顺序查找法。太晚了,明天写吧!!

三 . 代码实现

  1. class Solution
  2. {
  3. public int minNumberInRotateArray(int[] rotateArray)
  4. {
  5. // write code here
  6. //鲁棒判断
  7. if(rotateArray == null || rotateArray.Length <= )
  8. {
  9. return ;
  10. }
  11. //定义三个参数,用于后期的指针
  12. int a = ;
  13. int b = rotateArray.Length - ;
  14. int mid = ;
  15. //while终止条件(每次前者大于后者的时候均要对比,当二者差一个数据位时终止返回)
  16. while(rotateArray[a]>=rotateArray[b])
  17. {
  18. if(b - a == )
  19. {
  20. mid = b;
  21. break;
  22. }
  23. //二分查找法,对mid参数的修改
  24. mid = (b+a)/;
  25. //特殊情况,特殊对待(即数列中存在相等参数时,就采用顺序查找法)
  26. if(rotateArray[a] == rotateArray[mid] && rotateArray[mid] == rotateArray[b])
  27. {
  28. int min = rotateArray[a];
  29. for(int i = ;i<rotateArray.Length-;i++)
  30. {
  31. if(min<rotateArray[i])
  32. {
  33. min = rotateArray[i];
  34. }
  35. }
  36. }
  37. //二分查找法,前后指针的修改
  38. if(rotateArray[mid]>=rotateArray[a])
  39. {
  40. a = mid;
  41. }
  42. if(rotateArray[mid]<=rotateArray[b])
  43. {
  44. b = mid;
  45. }
  46. }
  47. //返回最小值
  48. return rotateArray[mid];
  49. }
  50. }

剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字的更多相关文章

  1. 《剑指offer》第十一题(旋转数组的最小数字)

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

  2. 《剑指offer》— JavaScript(6)旋转数组的最小数字

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

  3. (剑指Offer)面试题8:旋转数组的最小数字

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

  4. 剑指offer第二版面试题11:旋转数组的最小数字(JAVA版)

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

  5. 剑指Offer的学习笔记(C#篇)-- 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...

  6. 剑指Offer的学习笔记(C#篇)-- 反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...

  7. 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...

  8. 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  9. 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将  num1[0], num2[0 ...

随机推荐

  1. Selenium-几种等待方式

    强制等待 一直使用的time.sleep(5),可以放在任意地方,不好的地方,不太准确确定时间 隐形等待 driver.implicitly_wait(5) 设置了一个最长等待时间,如果在规定时间内网 ...

  2. Execution Context(EC) in ECMAScript

    参考资料 执行环境,作用域理解 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaScript系列(12):变量对象(Variable Object) 深入理解JavaScr ...

  3. linux命令学习笔记(20):find命令之exec

    find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作, 这个时候exec的作用就显现出来了. exec解释: -exec 参数后面跟的是command ...

  4. hdu 3998 Sequence

    There is a sequence X (i.e. x[1], x[2], ..., x[n]). We define increasing subsequence of X as x[i1], ...

  5. [POI 2018] Plan Metra

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5100 [算法] 首先分两类考虑 : 1. 1 -> N的路径不经过其它节点 , ...

  6. Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)

    Maven单元测试 分类: maven 2012-05-09 15:17 1986人阅读 评论(1) 收藏 举报 maven测试junit单元测试javarandom   目录(?)[-] maven ...

  7. LAMP 1.4 PHP编译安装

    1.下载                                                                                                 ...

  8. 杭电acm 1032题

    The Problem问题 Consider the following algorithm:考虑下面的算法: 1 2 3 4 5 6 input n print n if n = 1 then st ...

  9. 【BZOJ2839】集合计数 组合数+容斥

    [BZOJ2839]集合计数 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数 ...

  10. Servlet的一些细节

    由于客户端是通过URL地址访问web服务器的中的资源的,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet& ...