剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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 }
适当的采用顺序查找法。太晚了,明天写吧!!
三 . 代码实现
class Solution
{
public int minNumberInRotateArray(int[] rotateArray)
{
// write code here
//鲁棒判断
if(rotateArray == null || rotateArray.Length <= )
{
return ;
}
//定义三个参数,用于后期的指针
int a = ;
int b = rotateArray.Length - ;
int mid = ;
//while终止条件(每次前者大于后者的时候均要对比,当二者差一个数据位时终止返回)
while(rotateArray[a]>=rotateArray[b])
{
if(b - a == )
{
mid = b;
break;
}
//二分查找法,对mid参数的修改
mid = (b+a)/;
//特殊情况,特殊对待(即数列中存在相等参数时,就采用顺序查找法)
if(rotateArray[a] == rotateArray[mid] && rotateArray[mid] == rotateArray[b])
{
int min = rotateArray[a];
for(int i = ;i<rotateArray.Length-;i++)
{
if(min<rotateArray[i])
{
min = rotateArray[i];
}
}
}
//二分查找法,前后指针的修改
if(rotateArray[mid]>=rotateArray[a])
{
a = mid;
}
if(rotateArray[mid]<=rotateArray[b])
{
b = mid;
}
}
//返回最小值
return rotateArray[mid];
}
}
剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字的更多相关文章
- 《剑指offer》第十一题(旋转数组的最小数字)
// 面试题:旋转数组的最小数字 // 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. // 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组 // {3, ...
- 《剑指offer》— JavaScript(6)旋转数组的最小数字
旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2, ...
- (剑指Offer)面试题8:旋转数组的最小数字
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 剑指offer第二版面试题11:旋转数组的最小数字(JAVA版)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...
- 剑指Offer的学习笔记(C#篇)-- 序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
- 剑指Offer的学习笔记(C#篇)-- 反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...
- 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...
- 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...
- 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将 num1[0], num2[0 ...
随机推荐
- IDT 数据预览查询
前面做了一件非常愚蠢的事情,由于不会预览数据.我都是直接发布到webi去查看的.可以想象一下了.真是太年轻了.为自己感到十分的汗颜. 在数据基础层做好连接之后,可以查看数据基础 .会显示相应的join ...
- jQuery 事件 - one() 方法
jQuery 事件参考手册 实例 当点击 p 元素时,增加该元素的文本大小: $("p").one("click",function(){ $(this).an ...
- tomcat报错:Wrapper cannot find servlet class ...
tomcat发布工程时,在浏览器输入正确的地址,遇到如下问题: HTTP Status 500 - javax.servlet.ServletException: Wrapper cannot fin ...
- freeMarker(十六)——FAQ
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.JSP 和 FreeMarker ? 我们比较 FreeMarke ...
- HTML5视音频标签参考
本文将介绍HTML5中的视音频标签和对应的DOM对象.是相关资料的中文化版本,可以作为编写相关应用的简易中文参考手册. 一些约定 所有浏览器:指支持HTML5的常见桌面浏览器,包括IE9+.Firef ...
- 线段树Final版本
结构体是个好东西... 看着逼格很高 #include<iostream> #include<cstdio> #include<cstdlib> #include& ...
- google android sdk下载hoosts
203.208.46.146 www.google.com #这行是为了方便打开Android开发官网 现在好像不VPN也可以打开 74.125.113.121 developer.android.c ...
- bzoj 3165: [Heoi2013]Segment 线段树
题目: Description 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第i条被插入的线段的标号为i. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. ...
- bzoj 1113 海报pla
Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值 ...
- Django中的事务(Transaction)管理
Django默认的事务行为 默认情况下,在Django中事务是自动提交的.当我们运行Django内置的模板修改函数时,例如调用model.save()或model.delete()时,事务将被立即提交 ...