寻找旋转排序数组中的最小值
- 1. 题目解析
- 2. 讲解算法原理
- 3. 编写代码
1. 题目解析
题目地址:点这里
2. 讲解算法原理
-
首先,检查数组的最后一个元素是否大于第一个元素。如果是,说明数组没有进行旋转,直接返回第一个元素作为最小值。
-
如果数组进行了旋转,使用二分查找的思想来找到最小元素。
-
初始化两个指针 left 和 right,分别指向数组的起始位置和结束位置。
-
进入循环,循环条件为 left < right。
-
在每次循环中,计算中间元素的索引 mid,通过将左指针 left 和右指针 right 的差值除以2得到。
-
检查中间元素 nums[mid] 是否同时满足以下两个条件:
- nums[mid] < nums[mid+1]:中间元素小于其后一个元素。
- nums[mid] < nums[0]:中间元素小于数组的第一个元素。
-
如果满足这两个条件,说明最小元素在中间元素的左侧,将右指针 right 更新为 mid,继续搜索左侧。
-
如果不满足上述条件,说明最小元素在中间元素的右侧,将左指针 left 更新为 mid + 1,继续搜索右侧。
- 当循环结束时,左指针 left 指向的位置即为最小元素的索引,返回 nums[left] 即可得到最小元素的值。
3. 编写代码
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums[nums.size()-1]>nums[0]) return nums[0];
int left=0,right=nums.size()-1;
while(left<right)
{
int mid=left+(right-left)/2;
if(nums[mid]<nums[mid+1] &&nums[mid]<nums[0]) right=mid;
else left=mid+1;
}
return nums[left];
}
};