File tree Expand file tree Collapse file tree 2 files changed +68
-0
lines changed Expand file tree Collapse file tree 2 files changed +68
-0
lines changed Original file line number Diff line number Diff line change
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
+ };
Original file line number Diff line number Diff line change
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
+ };
You can’t perform that action at this time.
0 commit comments