目录
- 题目描述
- 思路分析
- AC 代码
- 总结
掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1
输入
[3,4,5,1,2]
返回值
1
二、思路分析
难度:简单
这个题考察的是数组和查找算法,解题方法一般有两种,第一种是暴力法,就是一层for循环找出数组中最小的数字,但是这种算法肯定不是面试官想要的。第二种是二分法,就是利用数组的非递减属性,完全使用二分法。
三、AC 代码
语言:Go
代码:
package main
/**
*
* @param rotateArray int整型一维数组
* @return int整型
*/
func minNumberInRotateArray( arr []int ) int {
if len(arr) == 0 {
return 0
}
left, right := 0, len(arr)-1
for left < right {
if arr[left] < arr[right] {
return arr[left]
}
mid := left+((right-left)>>1)
if arr[mid] > arr[right] {
left = mid + 1
} else if arr[mid] < arr[right] {
right = mid
} else {
right--
}
}
return arr[left]
}
通过截图:
四、总结
暴力法的时间复杂度是O(n),空间复杂度是O(1);二分法的时间复杂度是O(logN),但是如果数组所有元素相同,则每个元素都会遍历一遍,时间复杂度变成O(n),空间复杂度是O(1)。其实,当我们遇到类似特性的数组时,就可以考虑二分法。