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

旋转数组的最小数字

https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
     //找到峰值 峰值后的一个元素就位最小值
     //ab   ba  89   12 3 4567       3456 7 891   
     public int binartSort(int left,int right,int[] nums){
        int mid = (left+right)/2;
        if (left==right){
            return nums[mid];
        }
        if (nums[mid]>nums[mid+1]){
            return nums[mid+1];
        }
        if(nums[mid]>nums[right]){
            return binartSort(mid,right,nums);
        }else if (nums[mid]<=nums[right]){
            return binartSort(left,mid,nums);
        }
        return 0;
     }
    public int minNumberInRotateArray (int[] nums) {
        // write code here
        return binartSort(0,nums.length-1,nums);
    }
}

这道题的题目是将AB 一个有序的数组 变成一个无需的数组BA ,刚开始的想法是找到这个数组的峰值,峰值的后面一个元素也就是最小的元素,但是忽略了 这种情况,这种情况下,按照将mid和mid+1的不断比较去找峰值的做法是无法通过的 101111。

最终这种解法只通过了四个用例。

按照我之前的这种做法,对于上述用例,似乎只能在mid 和right 区间中找最小值,但是该用例的最小值却在左边区间,因此想到了是否有什么方法去定位区间,想到了可以与边界值进行比较。

对于这个例子 //ab ba 8912 3 4567 3456 7 8912

在这个例子中,如果a的长度大于b的长度,旋转后则会导致mid和尾部的值都是在a中取到,则会导致mid的值小于尾部的值。

反之,如果a的长度小于b的长度,旋转后,mid在b中取,尾部的值在a中取,a中的所有值都小于b的值,则自然mid的值大于尾部的值。

然后我就使用该方法定位区间,通过不断递归找到 mid>mid+1的情况。mid+1则为最小值。

题目给的要求是非递减数组旋转,则还有一种情况

对于 11 1 11 这种情况 按照我写完的算法,是无法处理的 因此,我增加了 这行代码。

if (left==right){
        return nums[mid];
    }

这道题目的思路有点绕,虽然最后稀里糊涂写对了hhhh

全部评论
这道题理解的不清晰,后面要着重看一下
点赞 回复 分享
发布于 03-07 12:09 广东

相关推荐

震撼沃玛一整年:查看图片
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-29 17:30
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务