Const
已知一个长度为 n 的数组,按升序排列,数组中的值 互不相同 。
在传递给函数之前,数组在预先未知的某个下标 k(0 <= k < n)上进行了旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标从 0 开始计数)。
给你旋转后的数组 nums ,请你找出其中最小的元素。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
输入: nums = [3,4,5,1,2]
nums = [3,4,5,1,2]
输出: 1
1
输入: nums = [4,5,6,7,0,1,2]
nums = [4,5,6,7,0,1,2]
输出: 0
0
输入: nums = [11,13,15,17]
nums = [11,13,15,17]
输出: 11
11
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
</rewritten_file>
由于原数组是严格升序的,所以旋转 1 次和旋转多次的结果是类似的:最终数组要么是一个完整的升序数组(即未旋转时的原数组),要么是两个升序数组的组合。 这两个升序数组的组合形式是:[较大的升序段 + 较小的升序段],其中较小的升序段的第一个元素就是整个数组的最小值。
使用二分查找,每次通过比较中值 nums[mid] 与 nums[right] 来判断中值 mid 属于哪个升序段:
因为这是一个旋转之后的递增序列:
153.寻找旋转排序数组中的最小值
已知一个长度为 n 的数组,按升序排列,数组中的值 互不相同 。
在传递给函数之前,数组在预先未知的某个下标 k(0 <= k < n)上进行了旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标从 0 开始计数)。
给你旋转后的数组 nums ,请你找出其中最小的元素。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
输入:
nums = [3,4,5,1,2]
输出:
1
示例 2:
输入:
nums = [4,5,6,7,0,1,2]
输出:
0
示例 3:
输入:
nums = [11,13,15,17]
输出:
11
提示:
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
</rewritten_file>