题目链接: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];
}
};
这篇博客探讨了在LeetCode上遇到的一个问题,作者首先尝试使用暴力搜索的方法,虽然成功解决了问题,但执行效率较低。随后,作者转向使用二分查找法,通过不断调整左右边界,逐步优化了算法,最终实现了更高效的解决方案。二分法的关键在于每次比较中间元素与右端点的关系,从而缩小搜索范围。
1248

被折叠的 条评论
为什么被折叠?



