Skip to content

Commit c0a0f90

Browse files
committed
feat: add solutions to lc problem: No.0754
No.0754.Reach a Number
1 parent ab41b45 commit c0a0f90

File tree

7 files changed

+86
-50
lines changed

7 files changed

+86
-50
lines changed

solution/0700-0799/0754.Reach a Number/README.md

+35-20
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,17 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56-
**方法一:数学**
56+
**方法一:数学分析**
5757

58-
由于对称性,我们将 `target` 统计取绝对值
58+
由于对称性,每次可以选择向左或向右移动,因此,我们可以将 $target$ 统一取绝对值
5959

60-
定义 `s`,一直循环累加,直至满足 $s\ge target$ 并且 $(s-target)\mod 2 = 0$。返回循环次数即可
60+
定义 $s$ 表示当前所处的位置,用变量 $k$ 记录移动的次数。初始时 $s$ 和 $k$ 均为 $0$
6161

62-
证明:如果 $s\ge target$ $(s-target)\mod 2 = 0$,那么只需要把前面 $(s-target)/2$ 这个数变为负数即可
62+
我们将 $s$ 一直循环累加,直到满足 $s\ge target$ 并且 $(s-target)\mod 2 = 0$,此时的移动次数 $k$ 就是答案,直接返回
6363

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)$。
6567

6668
<!-- tabs:start -->
6769

@@ -73,13 +75,12 @@
7375
class Solution:
7476
def reachNumber(self, target: int) -> int:
7577
target = abs(target)
76-
k = s = 0
78+
s = k = 0
7779
while 1:
7880
if s >= target and (s - target) % 2 == 0:
79-
break
81+
return k
8082
k += 1
8183
s += k
82-
return k
8384
```
8485

8586
### **Java**
@@ -90,16 +91,14 @@ class Solution:
9091
class Solution {
9192
public int reachNumber(int target) {
9293
target = Math.abs(target);
93-
int s = 0;
94-
int k = 0;
94+
int s = 0, k = 0;
9595
while (true) {
9696
if (s >= target && (s - target) % 2 == 0) {
97-
break;
97+
return k;
9898
}
9999
++k;
100100
s += k;
101101
}
102-
return k;
103102
}
104103
}
105104
```
@@ -112,14 +111,11 @@ public:
112111
int reachNumber(int target) {
113112
target = abs(target);
114113
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;
119116
++k;
120117
s += k;
121118
}
122-
return k;
123119
}
124120
};
125121
```
@@ -128,21 +124,40 @@ public:
128124
129125
```go
130126
func reachNumber(target int) int {
131-
s, k := 0, 0
132127
if target < 0 {
133128
target = -target
134129
}
130+
var s, k int
135131
for {
136132
if s >= target && (s-target)%2 == 0 {
137-
break
133+
return k
138134
}
139135
k++
140136
s += k
141137
}
142-
return k
143138
}
144139
```
145140

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+
146161
### **...**
147162

148163
```

solution/0700-0799/0754.Reach a Number/README_EN.md

+28-15
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,12 @@ On the 2<sup>nd</sup> move, we step from 1 to 3 (2 steps).
5555
class Solution:
5656
def reachNumber(self, target: int) -> int:
5757
target = abs(target)
58-
k = s = 0
58+
s = k = 0
5959
while 1:
6060
if s >= target and (s - target) % 2 == 0:
61-
break
61+
return k
6262
k += 1
6363
s += k
64-
return k
6564
```
6665

6766
### **Java**
@@ -70,16 +69,14 @@ class Solution:
7069
class Solution {
7170
public int reachNumber(int target) {
7271
target = Math.abs(target);
73-
int s = 0;
74-
int k = 0;
72+
int s = 0, k = 0;
7573
while (true) {
7674
if (s >= target && (s - target) % 2 == 0) {
77-
break;
75+
return k;
7876
}
7977
++k;
8078
s += k;
8179
}
82-
return k;
8380
}
8481
}
8582
```
@@ -92,14 +89,11 @@ public:
9289
int reachNumber(int target) {
9390
target = abs(target);
9491
int s = 0, k = 0;
95-
while (true) {
96-
if (s >= target && (s - target) % 2 == 0) {
97-
break;
98-
}
92+
while (1) {
93+
if (s >= target && (s - target) % 2 == 0) return k;
9994
++k;
10095
s += k;
10196
}
102-
return k;
10397
}
10498
};
10599
```
@@ -108,21 +102,40 @@ public:
108102
109103
```go
110104
func reachNumber(target int) int {
111-
s, k := 0, 0
112105
if target < 0 {
113106
target = -target
114107
}
108+
var s, k int
115109
for {
116110
if s >= target && (s-target)%2 == 0 {
117-
break
111+
return k
118112
}
119113
k++
120114
s += k
121115
}
122-
return k
123116
}
124117
```
125118

119+
### **JavaScript**
120+
121+
```js
122+
/**
123+
* @param {number} target
124+
* @return {number}
125+
*/
126+
var reachNumber = function (target) {
127+
target = Math.abs(target);
128+
let [s, k] = [0, 0];
129+
while (1) {
130+
if (s >= target && (s - target) % 2 == 0) {
131+
return k;
132+
}
133+
++k;
134+
s += k;
135+
}
136+
};
137+
```
138+
126139
### **...**
127140

128141
```

solution/0700-0799/0754.Reach a Number/Solution.cpp

+2-5
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@ class Solution {
33
int reachNumber(int target) {
44
target = abs(target);
55
int s = 0, k = 0;
6-
while (true) {
7-
if (s >= target && (s - target) % 2 == 0) {
8-
break;
9-
}
6+
while (1) {
7+
if (s >= target && (s - target) % 2 == 0) return k;
108
++k;
119
s += k;
1210
}
13-
return k;
1411
}
1512
};
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
func reachNumber(target int) int {
2-
s, k := 0, 0
32
if target < 0 {
43
target = -target
54
}
5+
var s, k int
66
for {
77
if s >= target && (s-target)%2 == 0 {
8-
break
8+
return k
99
}
1010
k++
1111
s += k
1212
}
13-
return k
1413
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
class Solution {
22
public int reachNumber(int target) {
33
target = Math.abs(target);
4-
int s = 0;
5-
int k = 0;
4+
int s = 0, k = 0;
65
while (true) {
76
if (s >= target && (s - target) % 2 == 0) {
8-
break;
7+
return k;
98
}
109
++k;
1110
s += k;
1211
}
13-
return k;
1412
}
1513
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* @param {number} target
3+
* @return {number}
4+
*/
5+
var reachNumber = function (target) {
6+
target = Math.abs(target);
7+
let [s, k] = [0, 0];
8+
while (1) {
9+
if (s >= target && (s - target) % 2 == 0) {
10+
return k;
11+
}
12+
++k;
13+
s += k;
14+
}
15+
};
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
class Solution:
22
def reachNumber(self, target: int) -> int:
33
target = abs(target)
4-
k = s = 0
4+
s = k = 0
55
while 1:
66
if s >= target and (s - target) % 2 == 0:
7-
break
7+
return k
88
k += 1
99
s += k
10-
return k

0 commit comments

Comments
 (0)