Rhyme/剑指Offer06 Java 旋转数组找最小值

23 篇文章 0 订阅
7 篇文章 0 订阅

剑指Offer06 Java 旋转数组找最小值

package offer6;

/**
 * 把一个数组最开始的若干个元素搬到数组的末尾,
 * 我们称之为数组的旋转。
 * 输入一个非递减排序的数组的一个旋转,
 * 输出旋转数组的最小元素。
 * 例如:数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转
 * 该数组的最小值为1
 * 求出旋转数组中的最小值
 * <p>
 * 思路:
 * <p>
 * 采用二分法的查找思想
 * <p>
 * 先确定该数组的一个mid中间索引值
 * <p>
 * 如果该中间值的右边比该中间值要小,则继续在右边二分查找
 * 否则在该中间值的左边进行二分查找
 * 当该中间值的左右两边都要比中间值大的时候,
 * 我们就找到了该旋转数组的最小值
 *
 * @author RhymeChiang
 * @date 2018/01/15
 **/
public class Offer6 {

    /**
     * 寻找旋转数组中的最小值
     *
     * @param array
     * @return
     */
    public static int findSmallest(int[] array) {
        // 数组为空
        if (array.length < 1) {
            return -1;
        }

        // 数组长度为1
        if (array.length == 1) {
            return array[0];
        }

        // 数组中只有两个元素
        if (array.length == 2) {
            return array[1];
        }

        int left = 0;
        int right = array.length - 1;
        int mid;
        int midValue;
        int midLeftValue;
        int midRightValue;
        while (left <= right) {
            mid = (left + right) / 2;
            midValue = array[mid];
            midLeftValue = array[mid - 1];
            midRightValue = array[mid + 1];
            // 找到最小值
            if (midValue <= midLeftValue && midValue <= midRightValue) {
                return midValue;
            }
            // 继续在左边二分查找
            if (midValue > midLeftValue) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {

        int []array = new int[]{6,7,8,1,2,3,4,5};

        System.out.println(findSmallest(array));
    }

}

测试结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值