【面试题11】旋转数组的最小数字

在这里插入图片描述
Python解法
首先得了解面试官的意图,这题用顺序搜索肯定不行,因此应该用二分。关于二分边界定义,这里有一篇好文,复习一下。
Note:1.考虑已经排好序的情况,初始化mid为0。
二分有一种特例,就是left=mid=right,此时无法判断前后,需采用顺序查找。

#《剑指Offer》思路
# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        def helper(r, left, right):
            res = r[left]
            for i in range(left, right+1):
                if r[i] < res:
                    res = r[i]
            return res
        if not rotateArray:return 0
        r = rotateArray
        left, right, mid = 0, len(rotateArray)-1, 0#考虑已经排好序的情况
        while r[left] >= r[right]:
            if right - left == 1:
                mid = right
                break
            mid = left + (right-left)/2
            if r[left] == r[right] and r[mid] == r[left]:
                return helper(r, left, right)
            if r[mid] >= r[left]:
                left = mid
            elif r[mid] <= r[right]:
                right = mid
        return r[mid]
#另类解法
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if not rotateArray:return 0
        r = rotateArray
        left, right = 0, len(rotateArray)-1
        while left < right:
            mid = left + (right-left)/2
            if r[mid-1]>r[mid]:#前面应该小
                return r[mid]
            if r[mid]>r[mid+1]:#后面应该大
                return r[mid+1]
            if r[mid]>r[left] and r[mid]>r[right]:
                left = mid
            if r[mid]<r[right] and r[mid]<r[left]:
                right = mid

考点

  • 考查对二分查找的理解;
  • 考查沟通能力和学习能力,需要短时间内理解“数组的旋转”这个新概念,主动与面试官沟通把概念弄清楚;
  • 考查思维的全面性,排序数组本身是数组旋转的一个特例,另外还需要考虑到数组中有相同数字的特征。

附录:(二分模板)

  1. 初始区间的选择:左开右开(-1,n)
  2. 循环条件的选择:left+1!=right
  3. 边界更新的选择:left=mid && right=mid
#可以在非递减序列中,查找某元素第一次出现的位置。
left, right = -1, n
while left+1 != right:
	mid = (left + right) / 2
	if array[mid] >= v:
		right = mid
	else:
		left = mid
	if right == n || array[right] != v:
		return -1
	return right
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值