CodeACM
HOT 100 · 二分查找 · LC 153

寻找旋转排序数组中的最小值:ACM 模式刷题

按标准输入读取测试数据,输出结果后可在 CodeACM 在线运行和提交。

题目描述

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:

· 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]

· 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

输入格式

第一行输入 n,第二行输入 n 个轮转后的整数。

输出格式

输出数组中的最小元素。

数据范围

  • 1 ≤ n ≤ 5000
  • −5000 ≤ nums[i] ≤ 5000
  • 所有元素互不相同

公开样例

样例 1

输入

5
3 4 5 1 2

输出

1

原数组为 [1,2,3,4,5],向右轮转 3 次后得到输入数组,最小值 1 出现在旋转点。

样例 2

输入

4
11 13 15 17

输出

11

数组 [11,13,15,17] 本身已经有序,可以视为轮转了整数个周期,最小值即为首元素 11。

练习建议

先根据输入输出格式写出可运行程序,再用公开样例检查结果;遇到边界情况时,补充自测用例后提交。