LeetCode刷题——算法学习计划(入门部分)
题目描述
思路介绍
由于本人学算法只是为了巩固C语言基础,所以就不会去深挖算法之根本
算法:二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。时间复杂度为:O(log2n)。——百度百科
我的第一次正确提交
由于昨天练习了二分法,所以今天基本没遇到啥奇怪的问题
我使用了比较直观的方法判断版本是否为第一个错误版本
——最后一次正确提交
的下一次错误提交
即为第一个错误版本。
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
int firstBadVersion(int n)
{
int left = 1;
int right = n;
int middle = 0;
while(left <= right)
{
middle = (right - left) / 2 + left;
if(isBadVersion(middle) == false && isBadVersion(middle + 1) == true)
return middle + 1;
else if(isBadVersion(middle) == true && isBadVersion(middle + 1) == true)
right = middle - 1;
else
left = middle + 1;
}
return 1; //第一版本就是错的
}
怎么会只用0ms,不合理啊
官方版本
下面是官方版本
只能说妙,先记下,以后再琢磨琢磨(不知道有没有以后😁)
int firstBadVersion(int n) {
int left = 1, right = n;
while (left < right) { // 循环直至区间左右端点相同
int mid = left + (right - left) / 2; // 防止计算时溢出
if (isBadVersion(mid)) {
right = mid; // 答案在区间 [left, mid] 中
} else {
left = mid + 1; // 答案在区间 [mid+1, right] 中
}
}
// 此时有 left == right,区间缩为一个点,即为答案
return left;
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/first-bad-version/solution/di-yi-ge-cuo-wu-de-ban-ben-by-leetcode-s-pf8h/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
5.3MB,但其实每次提交内存消耗都不同,有时比我那个版本还高,不懂了。
下面是我的失败
的提交记录
试了一下用循环判断
的方法,结果是肯定对的,但LeetCode判我为时间超过限制。
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
int firstBadVersion(int n) {
int i = 0;
for(i = n; i >= 1; i--)
{
if(isBadVersion(i) == true && isBadVersion(i - 1) == false)
return i;
}
return 1;
}