题目链接:leetcode.
二分法搞了半天没整明白,用暴力找
/*
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:11.9 MB, 在所有 C++ 提交中击败了18.10%的用户
*/
class Solution {
public:
int minArray(vector<int>& numbers) {
int N = numbers.size();
for(int i = 0;i < N - 1;++i)
{
if(numbers[i] > numbers[i + 1])
return numbers[i + 1];
}
return numbers[0];
}
};
看了官解,发现每次都用中间的数与右端比较,如果小于右端,说明右半边都大于中间,排除右半边;如果大于右端,说明左半边都大于中间,排除左半边;如果相等,无法确定,所以将右端点左移
原理就是,最小值左半边都比右端大,右半边都比右端小
/*
执行用时:8 ms, 在所有 C++ 提交中击败了52.18%的用户
内存消耗:11.9 MB, 在所有 C++ 提交中击败了5.81%的用户
*/
class Solution {
public:
int minArray(vector<int>& numbers) {
int N = numbers.size();
int left = 0, right = N - 1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(numbers[mid] < numbers[right])
{
right = mid;
}
else if(numbers[mid] > numbers[right])
{
left = mid + 1;
}
else
{
right--;
}
}
return numbers[left];
}
};