0%

20230227-第一个错误的版本

题目

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

示例 1:

输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
示例 2:

输入:n = 1, bad = 1
输出:1

提示:

1 <= bad <= n <= 231 - 1

解法

个人解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
impl Solution {
pub fn first_bad_version(&self, n: i32) -> i32 {
let mut left = 0;
let mut right = n;
let mut first_false = n;
while left < right {
let mid = left + (right - left) / 2;
let is_bad = self.isBadVersion(mid);
if is_bad {
right = mid;
if first_false > mid {
first_false = mid;
}
} else {
left = mid + 1;
}
}

first_false
}
}

示例解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
impl Solution {
pub fn first_bad_version(&self, n: i32) -> i32 {
let mut left = 1;
let mut right = n;
while left < right {
let mid = left + (right - left >> 1);
if self.isBadVersion(mid) {
right = mid;
} else {
left = mid + 1;
}
}
left
}
}

思路

写完后看示例解题,发下思路还不是很清晰

查找到的数据跟自己想的补太一样

还一个是处理越界的方案,最开始没有处理好。

然后除以二,可以用位移实现

来源