zoukankan      html  css  js  c++  java
  • 旋转数组的最小数字-剑指Offer

    旋转数组的最小数字

    题目描述

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

    思路

    1. 使用二分查找,因为该旋转数组是两段排序好的数组,可根据中间值判断中间值属于哪个排列数组,逐渐缩小范围。
    2. 注意考虑特殊情况,数组可能出现多个元素相等

    代码

    public class Solution06 {
        public int minNumberInRotateArray(int [] array) {
            if (array.length == 0) {
                return -1;
            }
            int index1 = 0;
            int index2 = array.length -1;
            int mid = index1;
            while (array[index1] >= array[index2]) {
                if ((index2 - index1) == 1) {
                    mid = index2;
                    break;
                }
                mid = (index2 + index1) / 2;
                if (array[mid] >= array[index1]) {
                    index1 = mid;
                } else if (array[mid] <= array[index2]) {
                    index2 = mid;
                }
            }
            return array[mid];
        }
    
    }

    改进

    考虑数组中出现多个相等的元素

    package com.sword;
    import java.util.ArrayList;
    public class Solution06 {
        public int minNumberInRotateArray(int [] array) {
            if (array.length == 0) {
                return -1;
            }
            int index1 = 0;
            int index2 = array.length -1;
            int mid = index1;
            while (array[index1] >= array[index2]) {
                if ((index2 - index1) == 1) {
                    mid = index2;
                    break;
                }
                mid = (index2 + index1) / 2;
                if (array[index1] == array[mid] && array[index2] == array[mid]) {
                    return minOrder(array, index1, index2);
                }
                if (array[mid] >= array[index1]) {
                    index1 = mid;
                } else if (array[mid] <= array[index2]) {
                    index2 = mid;
                }
            }
            return array[mid];
        }
        public int minOrder(int[] data, int start, int end) {
            int result = data[start];
            for (int i = start + 1; i <= end; i++) {
                if (result > data[i]) {
                    result = data[i];
                }
            }
            return result;
        }
    
    }
  • 相关阅读:
    软件工程 四则运算 基于控制台。
    新学期 新气象
    http://www.cnblogs.com/091JN/
    201421123091 ONLY-JN
    201421123091 ONLY-JN
    C语言课程学习的总结
    实验13——结构体、文件的基本应用
    实验12——指针的基础应用2
    实验11——指针的基础应用
    实验十——一维数组的定义及引用
  • 原文地址:https://www.cnblogs.com/rosending/p/5610556.html
Copyright © 2011-2022 走看看