旋转数组的最小数字(java和python版)

题目

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

解题思路

第一种方法:直接在数组中利用 自带的查找函数找到最小的那个,当然,这样面试官可能直接就让你滚粗了。
第二种方法:稍微优化一下,由题目可知,整个数组可以分为两个子数组,前面的子数组的最后一个元素肯定大于或者等于后面子数组的都一个元素,那么找到第一个前面数字大于或者等于后面数字的情况,那么后面这个较小的数字就是最小值

以上两种方法的时间复杂度均为O(N),在真实面试中肯定不行。

下面介绍面试官想要你给出的解法,即利用二分法进行查找。

以数组a[3,4,5,1,2]为例。
1.设置两个指针low,high,分别指向第一个以及最后一个元素 。
2.设置中间指针mid,指向中间元素,mid=low+(high-low)/2。
3.这里有三种情况:
(1)a[mid]>a[high],此时最小值一定在中间值的右边,设置low=mid+1。
(2)a[mid]>a[low],此时最小值一定在中间值的左边,设置high=mid。
(3) a[mid]=a[high],此时无法判断最小在左边还是右边,只有一个一个判断,即high=high-1。
最后返回a[low]的值。

java

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int low=0,high=array.length-1;
		if (array.length==0) {
			return 0;
			
		}
		while(low<high)
		{
			int mid = low+(high-low)/2;
			if(array[mid]>array[high])
				low=mid+1;
			
			else if (array[mid]==array[high]) {
				high=high-1;
				
			}
			else {
				high=mid;
			}
		}
		return array[low];
    
    }
}

python

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        pre = -7e20
        for num in rotateArray:
            if num < pre :
                return num
            pre = num
             
        if len(rotateArray) == 0:
            return 0
        return rotateArray[0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值