题解 | #旋转数组的最小数字#

思路

参照题解思路,使用双指针标记左右边界,通过判断中间值与右边界的大小来逼近最小值所在位置,因为旋转数组的性质,右边界必定是原先有序数组前半部分的一部分,如果中间值小于右边界,说明最小值还在中点的左边,如果中间值大于右边界,说明最小值在中点的右边,如果中间值等于右边界,需要一步步减小右边界索引,来试探。

代码

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int[] array) {
        if (array.length == 1) {
            return array[0];
        }
        // 定义双指针分别指向旋转数组的首尾
        int start = 0;
        int end = array.length - 1;
        return array[minNumberInRotateArray(array, start, end)];
    }

    public int minNumberInRotateArray(int[] array, int start, int end) {
        if (array.length == 1) {
            return array[0];
        }
        // 中点索引
        int mid = (start + end) / 2;

        // 终止条件
        if (start == mid) {
            return array[start] > array[end] ? end : start;
        }
        // 如果中点値大于右边界值,说明最小值仍在中点右边
        if (array[mid] > array[end]) {
            // 变换左边界值
            start = mid;
            return minNumberInRotateArray(array, start, end);

            // 如果中点値小于右边界值,说明最小值在中点左边
        } else if (array[mid] < array[end]) {
            // 变换右边界值
            end = mid;
            return minNumberInRotateArray(array, start, end);
            // 如果中点値等于右边界值,不容易区分区间,应当逐步减小右边区间
        } else {
            // 变换右边界值
            end--;
            return minNumberInRotateArray(array, start, end);
        }
    }

}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务