已知一个长度为 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) 的算法解决此问题。
示例 1:
输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
示例 2:
输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
示例 3:
输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。
提示:
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums 中的所有整数 互不相同
nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码如下
//[1 2 3 4 5]旋转第5次
//[2 3 4 5 1]旋转第1次
//[3 4 5 1 2]旋转第2次
//[4 5 1 2 3]旋转第3次
//[5 1 2 3 4]旋转第4次
//观察可以发现当中间任意元素mid,如果比left大则最小的元素min一定在右边且不是mid本身,而如果比left小则一定在右边但有可能是mid本身。
//而当left比right小时可以肯定left就是最小的元素min
int findMin(int* nums, int numsSize) {
int left = 0;
int right = numsSize - 1;
int mid;
while (left <= right)
{
if (nums[left] <= nums[right])
{
return nums[left];//返回最小值
}
mid = (left + right) / 2;
if (nums[mid] > nums[left])
{
left = mid + 1;//最小值在右侧
}
else if (nums[mid] < nums[left]) {//最小值在左侧
right = mid;
}
else//mid和left相等时为避免死循环自增+1吗,并在下一次循环中返回
{
left++;
}
}
return 0;//这段代码无任何意义,不知道为什么不加这段代码提交编译出错
}
void test01()
{
/*int arr[5] = { 1,2,3,4,5 };*/
//int arr[5] = { 2,3,4,5,1 };
int arr[7] = { 4,5,6,7,0,1,2};
/* int arr[5] = { 4,5,1,2,3 };*/
/*int arr[5] = { 5,1,2,3,4 };*/
int a=findMin(arr, 7);
cout << a;
}
int main()
{
test01();
return 0;
}
标签:153,nums,int,mid,旋转,力扣,最小值,数组,left From: https://www.cnblogs.com/wlxdaydayup/p/17316290.html