题目:
代码:
class Solution {
public:
int findMin(vector<int>& nums) {
int left, right, medium;
left = 1; //区间下标从1~nums.size()
right = nums.size();
medium = (nums.size() % 2 == 0) ? nums.size() / 2 : nums.size() / 2 + 1;
while (1)
{
if (right == left ) //寻找的区间只剩下一个元素,表示其他所有元素此前都被认定为非最小元素,故此元素为最小
{
return nums[medium - 1];
//break;
}
if (nums[medium - 1] > nums[medium]) //前一个数比其相邻的后一个数大,则后一个数一定是最小的元素
{
return nums[medium];
//break;
}
if (nums[medium-1] < nums[right-1]){ //如果medium < right,则将搜索范围缩小至左区间
right = medium;
medium = ((right - left + 1) % 2 == 0) ? (right - left + 1) / 2 : (right - left + 1) / 2 + 1;
}
else{ //如果medium > right,则将搜索范围缩小至右区间
left = medium;
medium = ((right - left + 1) % 2 == 0) ? (right - left + 1) / 2 : (right - left + 1) / 2 + 1;
medium = medium + left - 1;
}
}
}
};
结果:
思路:
(1)既然是排序好的数字,从中间某处旋转一下,那么,从头往后找肯定费时间。,这里采用类似折半的方式可以很快速的缩小查找区间。
具体思路以一个实例进行解说: