剑指offer第六题
来源:互联网 发布:python入门教程第三版 编辑:程序博客网 时间:2024/05/22 00:46
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array) { //异常判断 if(array.length == 0){ return 0; } int left = 0; int right = array.length - 1; int mid = left; while(array[left] >= array[right]){ //数组中只有两个元素 if(right - left == 1){ mid = right; break; } } //数组中有多个元素 // mid = (left + right)/2; mid = (left + right) / 2; //如果数组中所有的数全相等 if(array[left] == array[mid] && array[left] == array[right]){ return orderFind(array,left,right); } //如果最左边小于等于中间,说明最小值在后半部分,把mid位置标记为最左侧如{3,4,5,1,2} if(array[left] <= array[mid]){ left = mid; } //如果最左边的数大于等于中间,说明最小值在前半部分,把mid位置标记为最右侧{4,5,1,2,3} else if(array[left] >= array[mid]){ right = mid; } return array[mid]; } public int orderFind(int[] array,int left,int right){ int min = array[left]; for(int i = left + 1;i <= right;i++){ if(array[i] < array[left]){ min = array[i]; } } return min; }}
应该来说,这是考虑最周全的一种写法,但是我们在实际运行过程中编译器给出这样的提示:您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为0.00%
下面我们进行相应的优化 答案来源是剑指offer(java版).pdf
import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array) { if(array==null){ return 0; } int leftIndex=0; int rightIndex=array.length-1; int mid=0; while(array[leftIndex]>=array[rightIndex]){ if(rightIndex-leftIndex<=1){ mid=rightIndex; break; } mid=(leftIndex+rightIndex)/2; if(array[leftIndex]==array[rightIndex]&&array[leftIndex]==array[mid]){ if(array[leftIndex+1]!=array[rightIndex-1]){ mid=array[leftIndex+1]<array[rightIndex-1]?(leftIndex+1):(rightIndex-1); break; }else{ leftIndex++; rightIndex--; } }else{ if(array[mid]>=array[leftIndex]) leftIndex=mid; else { if(array[mid]<=array[rightIndex]) rightIndex=mid; } } } return array[mid]; } }
显然这里我们进行了一定的优化,这是这题我们其实还有其他的优化,如果知识纯粹的求得数组里面的最小值,假定第一个数组是最小值,当然我们可以直接使用一个for循环进行遍历直接交换即可得到我们想要的结果,二期居然能够通过,但我觉得这种方法肯定不是出题者的意图,毕竟太简单了!!!
阅读全文
0 0
- 剑指offer第六题
- 【剑指offer】第六题-重建二叉树
- 剑指offer第六题(数组)
- 剑指offer第六题【旋转数组的最小数字】c++实现
- 剑指Offer第六章面试题(Java版)
- 剑指offer第一题
- 剑指offer-题
- 剑指offer第一题
- 剑指Offer第一题
- 剑指offer(题三)
- 剑指offer第二题
- 剑指offer第三题
- 剑指offer第四题
- 剑指offer第五题
- 剑指offer题一
- 剑指offer题二
- 剑指offer题七
- 剑指offer题六
- WKWebView之OC代码注入,删除百度HTML页面的按钮
- Android 最常用的设计模式九 安卓源码分析—— 适配器模式(Adapter)
- Java虚拟机(JVM)中的内存设置详解
- Linux vi 撤销与取消撤销
- mybatis执行批量更新batch update 的方法
- 剑指offer第六题
- 指针与引用的区别
- 快速制作演示动画的工具TurboDemo常见问题合集(二)
- Python学习第一周-知识点
- hdu 1296 迷宫城堡【有向图scc+Tarjan入门】
- 变态跳台阶
- Closure&Inherit
- Java 定时器 Timer 的使用
- 基础知识