题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
示例 1:
输入: [1,3,5]
输出: 1
示例 2:
输入: [2,2,2,0,1]
输出: 0
说明:
这道题是 寻找旋转排序数组中的最小值 的延伸题目。
允许重复会影响算法的时间复杂度吗?会如何影响,为什么?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
白话题目:
算法:
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
int findMin(int*a, int n)
{
if (a == NULL || n == 0) {
return -1;
} else if (n == 1) {
return a[0];
}
int left = 0, right = n - 1;
while (left < right) {
int mid = left + (right - left)/ 2;
// printf("(%d-%d)=%d=[%d]\n", left, right, mid, a[mid]);
if (mid + 1 < n && a[mid] > a[mid + 1]) {
return a[mid + 1]; // 找到断点就退出
}
if (mid > 0 && a[mid - 1] > a[mid]) {
return a[mid]; // 找到断点就退出
}
if (a[left] > a[mid]) {
right = mid - 1;
} else if(a[left] < a[mid]) {
left = mid + 1;
} else { // 相等
if (a[right] >= a[right - 1]) {
right -= 1; // 右侧最大
} else { // 找到最小值
return a[right];
}
}
}
return a[0];
}