4月8号打卡

2021.4.8 寻找旋转排序数组中的最小值

题目描述

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素

思路

一种解法是直接遍历,时间复杂度是O(n),但本题可以采用二分法,虽然数组进行了旋转,但是取中间坐标,左右两侧总会有一侧是有序的,只需要对有序的一边进行考虑就行。
如果是左边有序,那么左边的一串数字一定是旋转过来的,最小值一定在右边,如果右边有序,那么最小值可能就是mid或者在左边。
定义 i j两个指针来确定区间,mid = (i + j) / 2
例如4 5 6 7 0 1 2 第一次寻找 --> mid = (0 + 6) / 2 = 3 : nums[mid] = 7 --> 4 5 6 7有序,就把左指针移到mid + 1 即 0 的位置继续寻找
有这几种情况我们就可以代码找出最小值

代码

    public static int findMin(int[] nums) {
        if(nums == null) return -1;
        int res = nums[0] , n = nums.length;
        int l = 0, mid ,r = n - 1;
        while(l <= r){
            mid = (r + l) / 2;
            if(nums[mid] <= nums[r]){
                res = Math.min(res,nums[mid]);
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值