【剑指Offer 6.旋转数组的最小数字】|刷题打卡

89 阅读1分钟

目录

  • 题目描述
  • 思路分析
  • 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]
}

通过截图:

image.png

四、总结

暴力法的时间复杂度是O(n),空间复杂度是O(1);二分法的时间复杂度是O(logN),但是如果数组所有元素相同,则每个元素都会遍历一遍,时间复杂度变成O(n),空间复杂度是O(1)。其实,当我们遇到类似特性的数组时,就可以考虑二分法。