6.旋转数组的最小数字(java)

题目描述

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

解题思路

1.最简单的方法,遍历一遍即可。数字为非递减排序,旋转后,遍历过程中找到第一个比array[0]小的数array[i]时说明array[i+1..n]>array[i],所以array[i]为最小值。复杂度O(n)

​
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int minNum = array[0];
        if(array.length==0) //数组为0的特殊情况
            return 0;
        for(int i = 1;i<array.length;i++)
        {
            if(minNum>array[i])
            {minNum = array[i];break;}
                
        }
        return minNum;
    }
}

​

2.二分法 复杂度o(logn)

import java.util.ArrayList;
public class Solution {
    public static int minNumberInRotateArray(int [] array) {
	        int low = 0;
	        int high = array.length-1;
	        int mid = 0;
	        while(low<high)
	        {
	            mid = (low + high)/2;
	            if(array[mid]>array[high])
	                low = mid+1; //mid大于high时,说明数组翻转在mid之后
	            else if(array[mid]<array[high])
	                high = mid; //mid小于high,说明mid已经超过最小值
	            else
                    high = high - 1; //有重复的数字不好判断,需要一个一个测试
	        }
	        return array[low];
	    }
}
发布了44 篇原创文章 · 获赞 0 · 访问量 478

猜你喜欢

转载自blog.csdn.net/gaopan1999/article/details/104455654