二分法的小变动

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

方法一:二分法(代码来源于 @FINACK 大佬)

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array.length==0){
            return 0;
        }

       int low=0,high=array.length-1;
        while(low<high){
            int mid=(low+high)/2;
            if(array[mid]>array[high]){
                low=mid+1;  
            }else if(array[mid]==array[high]){
                low=mid+1;  //或者high--;
            }else{
                high=mid;// 针对只有两个元素的情况
            }
        }
        return array[low];
     }

方法二:因为是有序数组的部分元素的反转,那么肯定是被划分为两个有序的子部分,一个递增,一个递减。而且递增的子数组是排在前面(此时可以假设最小值就是下标为0的数组元素),那么就可以通过最小值是否变动了来判断是否找到了俩个子数组的交界处(也就是最小元素处)

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array.length==0){
            return 0;
        }
        int min=array[0];
        for(int i=1;i<array.length;i++){
            if(array[i]<min){
                min=array[i];
                break;
            }

        }
        return min;

     }
}
#21天打卡剑指offer##Java#
全部评论

相关推荐

2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务