【LeetCode通关全记录】278. 第一个错误的版本
题目地址:278. 第一个错误的版本
解法:二分查找
这道题虽然看起来很绕,但本质上就是个简单的二分查找变体而已。因为这题要求的是第一个错误的版本,所以在判断错误版本时要让r = m
,并且判断条件要改成l < r
,这样最后会在l == r
时退出循环,此时返回的r
就是第一个错误版本。
通过这题学到一招:在二分查找中,使用公式l + (r - l) / 2
来求m
可以避免溢出的问题。
这里给出两种写法:
- 手写二分查找
/**
* Forward declaration of isBadVersion API.
* @param version your guess about first bad version
* @return true if current version is bad
* false if current version is good
* func isBadVersion(version int) bool;
*/
func firstBadVersion(n int) int {
l, r := 1, n
for l < r {
m := l + (r - l) / 2
if isBadVersion(m) {
r = m
} else {
l = m + 1
}
}
return r
}
执行用时: 0 ms(超过100%的Golang提交记录)
内存消耗: 1.9 MB(超过100%的Golang提交记录)
时间复杂度:O(logn),二分查找的时间复杂度为O(logn);
空间复杂度:O(1),只使用了常数个数的存储空间。
- 使用
sort.Search()
函数
/**
* Forward declaration of isBadVersion API.
* @param version your guess about first bad version
* @return true if current version is bad
* false if current version is good
* func isBadVersion(version int) bool;
*/
func firstBadVersion(n int) int {
return sort.Search(n, func(i int) bool {
return isBadVersion(i)
})
}
执行用时: 0 ms(超过100%的Golang提交记录)
内存消耗: 1.9 MB(超过100%的Golang提交记录)
时间复杂度:O(logn),二分查找的时间复杂度为O(logn);
空间复杂度:O(1),只使用了常数个数的存储空间。
网友评论