Skip to content

Commit f67e01b

Browse files
authored
Merge pull request #16 from colorbox/278
278. First Bad Version
2 parents 21f51a9 + 02728d5 commit f67e01b

File tree

5 files changed

+129
-0
lines changed

5 files changed

+129
-0
lines changed

278/step1.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
## 解くのに要した時間
3+
4+
07:01
5+
6+
## 計算量
7+
8+
O(logN)
9+
10+
## 思考の流れ
11+
12+
線形探索だと明らかに入力が大きい。
13+
二分探索することを考える。
14+
Good/Badの境界部分を探すと考える
15+
left=false
16+
right=true
17+
になるような二分探索を書きかけるが、
18+
https://github.com/colorbox/leetcode/pull/10#discussion_r1551560196
19+
での指摘を思い出して修正
20+
この場合境界の位置によってはleft=trueとなる場合もあるので、leftの状態も調べてreturn するようにした。
21+
*/
22+
class Solution {
23+
public:
24+
int firstBadVersion(int n) {
25+
int left = 1;
26+
int right = n;
27+
while (right-left > 1) {
28+
int mid = left + (right - left) / 2;
29+
if (isBadVersion(mid)) {
30+
right = mid;
31+
} else {
32+
left = mid;
33+
}
34+
}
35+
if (isBadVersion(left)) {
36+
return left;
37+
} else {
38+
return right;
39+
}
40+
}
41+
};

278/step2.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
他の人のコードや解説を見て完了したコード
3+
二分探索のwhileの継続条件部分が効率の良くない形になっていたので修正
4+
二分探索で範囲を狭める時にチェック済みの箇所についても+1/-1で追加で狭めるように修正(https://github.com/colorbox/leetcode/pull/10#discussion_r1551560196)
5+
上記2点の修正後、whileループ後の無駄なチェックをなくせるようになったのでそれらを削除
6+
7+
leftが最初にtrueとなる位置なので、leftを返して良くなる
8+
midの状態は確定しているので、`left = mid + 1`によって、leftに対して未確定の位置を与える。
9+
これによって少しだけ高速化される。
10+
11+
*/
12+
class Solution {
13+
public:
14+
int firstBadVersion(int n) {
15+
int left = 1;
16+
int right = n;
17+
while (left <= right) {
18+
int mid = left + (right - left) / 2;
19+
if (isBadVersion(mid)) {
20+
right = mid - 1;
21+
} else {
22+
left = mid + 1;
23+
}
24+
}
25+
return left;
26+
}
27+
};

278/step3.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
int firstBadVersion(int n) {
4+
int left = 1;
5+
int right = n;
6+
7+
while (left <= right) {
8+
int mid = left + (right - left) / 2;
9+
if (isBadVersion(mid)) {
10+
right = mid - 1;
11+
} else {
12+
left = mid + 1;
13+
}
14+
}
15+
return left;
16+
}
17+
};

278/step4.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
int firstBadVersion(int n) {
4+
if (isBadVersion(1)) {
5+
return 1;
6+
}
7+
8+
int left = 1;
9+
int right = n;
10+
11+
while (left + 1 < right) {
12+
int mid = left + (right - left) / 2;
13+
if (isBadVersion(mid)) {
14+
right = mid;
15+
} else {
16+
left = mid;
17+
}
18+
}
19+
return right;
20+
}
21+
};

278/step5.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
bisect_left
3+
https://github.com/python/cpython/blob/main/Lib/bisect.py
4+
を参考に書いたコード
5+
*/
6+
class Solution {
7+
public:
8+
int firstBadVersion(int n) {
9+
int left = 1;
10+
int right = n;
11+
12+
while (left < right) {
13+
int mid = left + (right - left) / 2;
14+
if (isBadVersion(mid)) {
15+
right = mid;
16+
} else {
17+
left = mid + 1;
18+
}
19+
}
20+
21+
return left;
22+
}
23+
};

0 commit comments

Comments
 (0)