牛客网剑指offer_18题_代码与解析

牛客网剑指offer_18题

分析

分析:
①二分法做题
②选择最大索引为target,最小值不行。再选择最小索引low=0和中间索引mid=target/2
③对每一步二分进行循环,循环的终止就是mid==low
④在循环中将mid与targe的【值!】t比较分为三种情况:
    a.array[target] > array[mid]  可以判断最小值在low-mid之间    重新修改mid和target
    b.array[target] < array[mid]  可以判断最小值在mid-target之间 重新修改mid和low
    c.array[target] == array[mid] 无法判断在哪边,需要在【low,target】之间遍历找到最小值
⑤在循环结束后,判断low和target索引所在的值哪个最小,即为所求。

代码与解析

package com.offer;

import java.util.ArrayList;
public class JZ6 {
    /**
     * 题目描述
     * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
     * 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
     * NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
     * 示例1
     * 输入
     * 复制
     * [3,4,5,1,2]
     * 返回值
     * 复制
     * 1
     * @param array
     * @return
     */
    public int minNumberInRotateArray(int [] array) {
        if(array.length==0)
            return 0;

        int target =array.length-1;
        int mid = (array.length-1)/2;
        int low = 0;

        while(low!=mid) {
            if (array[target] > array[mid]) {
                target = mid;
                mid = target / 2;
            } else if (array[target] < array[mid]) {
                low = mid;
                mid = mid + (target - mid) / 2;
            } else {
                int min = Integer.MAX_VALUE;
                for (int i = low; i <= target; i++) {
                    if (array[i] < min)
                        min = array[i];
                }
                return min;
            }
        }
        return (array[target]>array[low])?array[low]:array[target];
    }

    public static void main(String[] args) {
        int[] arr = {4,5,6,2,3};
        int[] arr1 = {4,4,4,4,4};
        JZ6 jz6 = new JZ6();
        System.out.println(jz6.minNumberInRotateArray(arr));
        System.out.println(jz6.minNumberInRotateArray(arr1));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值