zoukankan      html  css  js  c++  java
  • 剑指Offer(书):旋转数组的最小数字

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

    分析:因为有序,可以使用二分查找,但有特殊情况,比如{1,0,1,1,1}{1,1,1,0,1}都是{0,1,1,1,1}的旋转,使用二分查找时无法分辨0所在的位置是在前半段还是后半段,只能用顺序查找。

    public class Solution11 {
    
        /**
         * 使用二分查找,但有特殊情况,比如{1,0,1,1,1}{1,1,1,0,1}都是{0,1,1,1,1}的旋转,使用二分查找时无法分辨0所在的位置是在前半段还是后半段,只能用顺序查找。
         * {3,4,5,1,2}
         * @param array
         * @return
         */
        public int minNumberInRotateArray(int[] array) {
            if (array == null ) {
                throw new IllegalArgumentException("参数错误! array的值不能为null");
            }
            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;
                if (array[left] == array[right] && array[left] == array[mid]) {
                    int result = array[0];
                    for (int i = 0; i < array.length - 1; i++) {
                        if (array[i + 1] < array[i]) {
                            result = array[i + 1];
                        }
                    }
                    return result;
                }
                if (array[mid] >= array[left]) {
                    left = mid;
                } else if (array[mid] <= array[right]) {
                    right = mid;
                }
            }
            return array[mid];
        }
    
        public static void main(String[] args) {
            Solution11 solution11 = new Solution11();
            long start = System.nanoTime();
            System.out.println(solution11.minNumberInRotateArray(new int[]{1,2,3,4,5}));
            System.out.print((System.nanoTime() - start) / 1000000000.0);
        }
    }
  • 相关阅读:
    error MSB6006: ”cmd.exe” exited with code 1
    OpenGL简介
    OSG例程(1) 交互(Pick)
    $err,hr
    [转载]操作数的寻址方式
    严重推荐的图形学讲义
    编译通过,运行时osgDB::ReadImageFile()出错 d和非d的lib
    空间变换的顺序SRT
    OSG例程(3) 利用更新回调制作路径动画
    Visitor模式的C++实现
  • 原文地址:https://www.cnblogs.com/liter7/p/9427163.html
Copyright © 2011-2022 走看看