您的位置:首页 > 职场人生

(未完成)《剑指offer》(面试题8):旋转数组的最小数字

2018-01-31 10:50 525 查看
其中排序和查找是面试时考察算法的重点。
在准备面试的时候,我们应该重点掌握二分查找,归并排序和快速排序,做到能随时正确,完整地写出他们的代码。

如果面试题是要求在排序的数组(或者部分排序的数组)中查找一个数字或者统计某个数字出现的次数,我们都可以尝试用二分查找算法。

查找相对而言较为简单,不外乎顺序查找,二分查找,哈希表查找和二叉排序树查找。

排序比查找要复杂一些。面试官会经常要求应聘者比较插入排序,冒泡排序,归并排序和快速排序等不同算法的优劣。强烈建议应聘者在准备面试的时候,一定要对各种排序算法的特点烂熟于胸,能够从额外空间消耗,平均时间复杂度和最差时间复杂度等方面去比较他们的优缺点。特别强调的是,很多公司的面试官喜欢在面试环节中要求应聘者写出快速排序的代码。

不同的排序算法适用的场合也不尽相同。快速排序虽然总体的平均效率是最好的,但也不是任何时候都是最优的算法。

在面试的时候,如果面试官要求实现一个排序算法,那么应聘者一定要问清楚这个排序应用的环境是什么,有哪些约束条件,在得到足够多的信息之后再选择最合适的排序算法。


题目描述

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



解题思路


直接查找

算法复杂度O(n)。


再次排序

再次排序后输出第一个数字,算法复杂度O(n*logn)。


分段二分查找

算法复杂度O(logn)。
我们用两个指针分别指向数组的第一个元素和最后一个元素。按照题目中旋转的规则,第一个元素应该是大于或者等于最后一个元素的(不完全对,有特例)。
接着我们可以找到数组中间的元素。如果中间元素位于前面的递增子数组,那么它应该大于或者等于第一个指针指向的元素。此时最小元素应该位于该中间元素之后,然后我们把第一个指针指向该中间元素,移动之后第一个指针仍然位于前面的递增子数组中。
同样,如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指向的元素。此时最小元素应该位于该中间元素之前,然后我们把第二个指针指向该中间元素,移动之后第二个指针仍然位于后面的递增子数组中。
第一个指针总是指向前面递增数组的元素,第二个指针总是指向后面递增数组的元素。最终它们会指向两个相邻的元素,而第二个指针指向的刚好是最小的元素,这就是循环结束的条件。



特殊情况: 
- 如果把排序数组的0个元素搬到最后面,这仍然是租住的一个需安装,我们的代码需要支持这种情况。如果发现数组中的一个数字小于最后一个数字,就可以直接返回第一个数字了。 
- 下面这种情况,即第一个指针指向的数字、第二个指针指向的数字和中间的数字三者相等,我们无法判断中间的数字1是数以前面的递增子数组还是后面的递增子数组。正样的话,我们只能进行顺序查找。



python 代码实现:

# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray) == 0:
return 0
pre = -7e20
for num in rotateArray:
if num < pre :
return num
pre = num
return rotateArray[0]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: