Skip to content

Commit aa05929

Browse files
committed
Add step1 and step2
1 parent 21f51a9 commit aa05929

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-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+
};

0 commit comments

Comments
 (0)