0
点赞
收藏
分享

微信扫一扫

数组理解,二分查找,临界条件

描述

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

数据范围:1 \le n \le 100001≤n≤10000,数组中任意元素的值: 0 \le val \le 100000≤val≤10000

要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)

import java.util.ArrayList;
public class Solution {
    //这题仔细观察发现:本身是非递减的数组,你将前面的若干个数字进行旋转,整个数组被分为两部分
    //第一部分和第二部分都是非递减的,但是前面整体比后面大
    //那么最小的数字肯定在第二部分的第一个,如果去找到第二部分的头,是我们要做的
    //这题有多种解法,但是利用二分和上面的查找思想是比较好的
    public static int minNumberInRotateArray(int[] array) {
        if (array == null || array.length == 0) {
            return 0;
        }
        int i = 0;
        int j = array.length - 1;
        int mid = 0;
        while (i < j) {

            if (j - i == 1) {
                mid = j;
                break;
            }
            
            if (array[j] == array[j] && array[mid] == array[i]) {
                int minnum = array[i];
                for (int k = i + 1; k < j; k++) {
                    if (array[k] < minnum) {
                        minnum = array[k];
                    }
                }
                return minnum;
            }
            mid = i + ((j - i)>>1);
            if (array[mid] >= array[i]) {
                //说明此时中间下标还是处于第一部分
                i = mid;
            }
            if (array[mid] < array[i]) {
                //此时mid处于第二部分
                j = mid;
            }
        }

        return array[mid];
    }
}
举报

相关推荐

[数组]二分查找

二分查找的理解

算法-数组:二分查找

数组线性查找和二分查找

数组的二分查找法

【二分查找】704. 二分查找

0 条评论