【剑指offer】旋转数组的最小数字&&二分查找
来源:互联网 发布:淘宝开店 客户达 编辑:程序博客网 时间:2024/05/16 09:57
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
public class Solution { /** * 简易方法,显然这题不是考察这个的。 * 复杂度:O(n) * @param array * @return */ public int minNumberInRotateArray(int [] array) { if(array.length ==0) return 0; for(int i=0;i<array.length-1;i++){ if(array[i]>array[i+1]){ return array[i+1]; } } //不要忘记完全旋转:相当于没旋转,最小数为第一个 return array[0]; } /** * 二分查找临界点 * 复杂度:O(logn) * 完全旋转不适用:middle是-1 * @param array * @return */ public int minNumberInRotateArray2(int [] array) { if(array.length ==0) return 0; int left = 0; int right = array.length-1; int middle = -1; //二分查找,保证数据递增or递减(有序) //右边界小于左边界的,该数一定在两个边界范围内 while(array[left] >= array[right]){ if(right - left == 1){ middle = right; break; } middle = left+(right - left) / 2; //如果[left,middle]中右边界大于左边界,证明仍旧是递增,该数在另一边。 if(array[middle] >= array[left]){ left = middle; } //如果[middle,right]中右边界大于左边界,证明仍旧是递增,该数在另一边。 if(array[middle] <= array[right]){ right = middle; } } return array[middle]; } public static void main(String[] args){ int[] s = new int[]{1,2,3,4,5,6}; System.out.println(new Solution().minNumberInRotateArray2(s)); }}
0 0
- 【剑指offer】旋转数组的最小数字&&二分查找
- 剑指offer-旋转数组的最小数字-二分查找法
- 【剑指offer】【旋转数组的最小数字 】二分查找的变体
- 剑指Offer面试题8旋转数组的最小数字(二分查找)附带快排和按年龄排序
- 【剑指offer】旋转数组的最小数字
- 剑指offer--旋转数组的最小数字
- 剑指offer--旋转数组的最小数字
- 剑指offer:旋转数组的最小数字
- 《剑指offer》旋转数组的最小数字
- 剑指 offer:旋转数组的最小数字
- 剑指offer-旋转数组的最小数字
- 剑指offer 旋转数组的最小数字
- 【剑指offer】旋转数组的最小数字
- 剑指offer 旋转数组的最小数字
- 剑指offer-旋转数组的最小数字
- 剑指Offer:旋转数组的最小数字
- 剑指Offer 旋转数组的最小数字
- 剑指offer|旋转数组的最小数字
- android studio从2.2.2更新到2.3之后第一次启动超级慢解决办法
- 文章标题
- Android-ContentProvider
- 常见词汇
- C++之两大面试题
- 【剑指offer】旋转数组的最小数字&&二分查找
- DOS系统常用命令
- 【其他】win10下TensorFlow(gpu版)安装教程
- win7 64位安装redis 及Redis Desktop Manager使用
- Bellman-Ford算法(队列优化)
- Hello World
- Hibernate1
- 1、基础命令和基本知识
- 春雪