53
53
54
54
<!-- 这里可写通用的实现逻辑 -->
55
55
56
- ** 方法一:数学 **
56
+ ** 方法一:数学分析 **
57
57
58
- 由于对称性,我们将 ` target ` 统计取绝对值 。
58
+ 由于对称性,每次可以选择向左或向右移动,因此,我们可以将 $ target$ 统一取绝对值 。
59
59
60
- 定义 ` s ` ,一直循环累加,直至满足 $s\ge target$ 并且 $(s-target)\mod 2 = 0$。返回循环次数即可 。
60
+ 定义 $s$ 表示当前所处的位置,用变量 $k$ 记录移动的次数。初始时 $s$ 和 $k$ 均为 $0$ 。
61
61
62
- 证明:如果 $s\ge target$ 且 $(s-target)\mod 2 = 0$,那么只需要把前面 $(s-target)/2$ 这个数变为负数即可 。
62
+ 我们将 $s$ 一直循环累加,直到满足 $s \ge target$ 并且 $(s-target)\mod 2 = 0$,此时的移动次数 $k$ 就是答案,直接返回 。
63
63
64
- 时间复杂度 $O(\sqrt{target})$。
64
+ 为什么?因为如果 $s\ge target$ 且 $(s-target)\mod 2 = 0$,我们只需要把前面 $\frac{s-target}{2}$ 这个正整数变为负数,就能使得 $s$ 与 $target$ 相等。正整数变负数的过程,实际上是将移动的方向改变,但实际移动次数仍然不变。
65
+
66
+ 时间复杂度 $O(\sqrt{\left | target \right | })$,空间复杂度 $O(1)$。
65
67
66
68
<!-- tabs:start -->
67
69
73
75
class Solution :
74
76
def reachNumber (self , target : int ) -> int :
75
77
target = abs (target)
76
- k = s = 0
78
+ s = k = 0
77
79
while 1 :
78
80
if s >= target and (s - target) % 2 == 0 :
79
- break
81
+ return k
80
82
k += 1
81
83
s += k
82
- return k
83
84
```
84
85
85
86
### ** Java**
@@ -90,16 +91,14 @@ class Solution:
90
91
class Solution {
91
92
public int reachNumber (int target ) {
92
93
target = Math . abs(target);
93
- int s = 0 ;
94
- int k = 0 ;
94
+ int s = 0 , k = 0 ;
95
95
while (true ) {
96
96
if (s >= target && (s - target) % 2 == 0 ) {
97
- break ;
97
+ return k ;
98
98
}
99
99
++ k;
100
100
s += k;
101
101
}
102
- return k;
103
102
}
104
103
}
105
104
```
@@ -112,14 +111,11 @@ public:
112
111
int reachNumber(int target) {
113
112
target = abs(target);
114
113
int s = 0, k = 0;
115
- while (true) {
116
- if (s >= target && (s - target) % 2 == 0) {
117
- break;
118
- }
114
+ while (1) {
115
+ if (s >= target && (s - target) % 2 == 0) return k;
119
116
++k;
120
117
s += k;
121
118
}
122
- return k;
123
119
}
124
120
};
125
121
```
@@ -128,21 +124,40 @@ public:
128
124
129
125
```go
130
126
func reachNumber(target int) int {
131
- s, k := 0, 0
132
127
if target < 0 {
133
128
target = -target
134
129
}
130
+ var s, k int
135
131
for {
136
132
if s >= target && (s-target)%2 == 0 {
137
- break
133
+ return k
138
134
}
139
135
k++
140
136
s += k
141
137
}
142
- return k
143
138
}
144
139
```
145
140
141
+ ### ** JavaScript**
142
+
143
+ ``` js
144
+ /**
145
+ * @param {number} target
146
+ * @return {number}
147
+ */
148
+ var reachNumber = function (target ) {
149
+ target = Math .abs (target);
150
+ let [s, k] = [0 , 0 ];
151
+ while (1 ) {
152
+ if (s >= target && (s - target) % 2 == 0 ) {
153
+ return k;
154
+ }
155
+ ++ k;
156
+ s += k;
157
+ }
158
+ };
159
+ ```
160
+
146
161
### ** ...**
147
162
148
163
```
0 commit comments