【LeetCode通关全记录】278. 第一个错误的版本

【LeetCode通关全记录】278. 第一个错误的版本

题目地址:278. 第一个错误的版本

解法:二分查找

这道题虽然看起来很绕,但本质上就是个简单的二分查找变体而已。因为这题要求的是第一个错误的版本,所以在判断错误版本时要让r = m,并且判断条件要改成l < r,这样最后会在l == r时退出循环,此时返回的r就是第一个错误版本。

通过这题学到一招:在二分查找中,使用公式l + (r - l) / 2来求m可以避免溢出的问题。

这里给出两种写法:

  1. 手写二分查找
/** 
 * 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),只使用了常数个数的存储空间。

  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),只使用了常数个数的存储空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值