Skip to content

Commit 8d7e2ff

Browse files
committed
feat: add solutions to lc problem: No.1652
No.1652.Defuse the Bomb
1 parent 2f126aa commit 8d7e2ff

File tree

7 files changed

+395
-43
lines changed

7 files changed

+395
-43
lines changed

lcci/17.09.Get Kth Magic Number/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525

2626
**方法二:动态规划**
2727

28-
定义数组 `dp`,其中 `dp[i]` 表示第 $i$ 个数,答案即为 `dp[k]`
28+
定义数组 $dp$,其中 $dp[i]$ 表示第 $i$ 个数,答案即为 $dp[k]$
2929

30-
定义三个指针 `p3`, `p5`, `p7`,表示下一个数是当前指针指向的数乘以对应的质因数,初始值都为 $1$。
30+
定义三个指针 $p_3$, $p_5$, $p_7$,表示下一个数是当前指针指向的数乘以对应的质因数,初始值都为 $1$。
3131

3232
当 $2\le i \le k$ 时,令 $dp[i] = \min(dp[p_3\times 3], dp[p_5]\times 5, dp[p_7]\times 7)$,然后分别比较 $dp[i]$ 和 $dp[p_3]\times 3, dp[p_5]\times 5, dp[p_7]\times 7$,如果相等,则将对应的指针加 $1$。
3333

solution/1600-1699/1652.Defuse the Bomb/README.md

Lines changed: 183 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,37 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64-
数组下标取模,累加求每一项即可。
64+
**方法一:模拟**
65+
66+
定义答案数组 `ans`,长度为 $n$,初始时所有元素都为 $0$。根据题意,若 $k$ 为 $0$,直接返回 `ans`
67+
68+
否则,遍历每个位置 $i$:
69+
70+
若 $k$ 为正数,那么 $i$ 位置的值为 $i$ 位置后 $k$ 个位置的值之和,即:
71+
72+
$$
73+
ans[i] = \sum_{j=i+1}^{i+k} code[j\mod{n}]
74+
$$
75+
76+
若 $k$ 为负数,那么 $i$ 位置的值为 $i$ 位置前 $|k|$ 个位置的值之和,即:
77+
78+
$$
79+
ans[i] = \sum_{j=i+k}^{i-1} code[(j+n)\mod{n}]
80+
$$
81+
82+
时间复杂度 $O(n\times|k|)$,忽略答案的空间消耗,空间复杂度 $O(1)$。
83+
84+
**方法二:前缀和**
85+
86+
在方法一中,对于每个位置 $i$,都需要遍历 $k$ 个位置,有很多重复计算的操作。我们可以利用前缀和来优化。
87+
88+
我们将 `code` 数组复制一份(可以不用执行复制操作,直接通过循环遍历取模实现),得到两倍长度的数组,对其求前缀和,得到长度为 $2\times n + 1$ 的前缀和数组 $s$。
89+
90+
若 $k$ 为正数,那么 $i$ 位置的值为 $i$ 位置后 $k$ 个位置的值之和,即 $ans[i] = s[i + k + 1] - s[i + 1]$。
91+
92+
若 $k$ 为负数,那么 $i$ 位置的值为 $i$ 位置前 $|k|$ 个位置的值之和,即 $ans[i] = s[i + n] - s[i + k + n]$。
93+
94+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为 `code` 数组的长度。
6595

6696
<!-- tabs:start -->
6797

@@ -73,17 +103,33 @@
73103
class Solution:
74104
def decrypt(self, code: List[int], k: int) -> List[int]:
75105
n = len(code)
76-
res = [0] * n
106+
ans = [0] * n
77107
if k == 0:
78-
return res
108+
return ans
79109
for i in range(n):
80110
if k > 0:
81111
for j in range(i + 1, i + k + 1):
82-
res[i] += code[j % n]
112+
ans[i] += code[j % n]
83113
else:
84114
for j in range(i + k, i):
85-
res[i] += code[(j + n) % n]
86-
return res
115+
ans[i] += code[(j + n) % n]
116+
return ans
117+
```
118+
119+
```python
120+
class Solution:
121+
def decrypt(self, code: List[int], k: int) -> List[int]:
122+
n = len(code)
123+
ans = [0] * n
124+
if k == 0:
125+
return ans
126+
s = list(accumulate(code + code, initial=0))
127+
for i in range(n):
128+
if k > 0:
129+
ans[i] = s[i + k + 1] - s[i + 1]
130+
else:
131+
ans[i] = s[i + n] - s[i + k + n]
132+
return ans
87133
```
88134

89135
### **Java**
@@ -94,24 +140,148 @@ class Solution:
94140
class Solution {
95141
public int[] decrypt(int[] code, int k) {
96142
int n = code.length;
97-
int[] res = new int[n];
98-
if (k == 0) return res;
143+
int[] ans = new int[n];
144+
if (k == 0) {
145+
return ans;
146+
}
99147
for (int i = 0; i < n; ++i) {
100148
if (k > 0) {
101-
for (int j = i + 1; j <= i + k; ++j) {
102-
res[i] += code[j % n];
149+
for (int j = i + 1; j < i + k + 1; ++j) {
150+
ans[i] += code[j % n];
103151
}
104152
} else {
105-
for (int j = i + k; j <= i - 1; ++j) {
106-
res[i] += code[(j + n) % n];
153+
for (int j = i + k; j < i; ++j) {
154+
ans[i] += code[(j + n) % n];
107155
}
108156
}
109157
}
110-
return res;
158+
return ans;
111159
}
112160
}
113161
```
114162

163+
```java
164+
class Solution {
165+
public int[] decrypt(int[] code, int k) {
166+
int n = code.length;
167+
int[] ans = new int[n];
168+
if (k == 0) {
169+
return ans;
170+
}
171+
int[] s = new int[n << 1 | 1];
172+
for (int i = 0; i < n << 1; ++i) {
173+
s[i + 1] = s[i] + code[i % n];
174+
}
175+
for (int i = 0; i < n; ++i) {
176+
if (k > 0) {
177+
ans[i] = s[i + k + 1] - s[i + 1];
178+
} else {
179+
ans[i] = s[i + n] - s[i + k + n];
180+
}
181+
}
182+
return ans;
183+
}
184+
}
185+
```
186+
187+
### **C++**
188+
189+
```cpp
190+
class Solution {
191+
public:
192+
vector<int> decrypt(vector<int>& code, int k) {
193+
int n = code.size();
194+
vector<int> ans(n);
195+
if (k == 0) {
196+
return ans;
197+
}
198+
for (int i = 0; i < n; ++i) {
199+
if (k > 0) {
200+
for (int j = i + 1; j < i + k + 1; ++j) {
201+
ans[i] += code[j % n];
202+
}
203+
} else {
204+
for (int j = i + k; j < i; ++j) {
205+
ans[i] += code[(j + n) % n];
206+
}
207+
}
208+
}
209+
return ans;
210+
}
211+
};
212+
```
213+
214+
```cpp
215+
class Solution {
216+
public:
217+
vector<int> decrypt(vector<int>& code, int k) {
218+
int n = code.size();
219+
vector<int> ans(n);
220+
if (k == 0) {
221+
return ans;
222+
}
223+
vector<int> s(n << 1 | 1);
224+
for (int i = 0; i < n << 1; ++i) {
225+
s[i + 1] = s[i] + code[i % n];
226+
}
227+
for (int i = 0; i < n; ++i) {
228+
if (k > 0) {
229+
ans[i] = s[i + k + 1] - s[i + 1];
230+
} else {
231+
ans[i] = s[i + n] - s[i + k + n];
232+
}
233+
}
234+
return ans;
235+
}
236+
};
237+
```
238+
239+
### **Go**
240+
241+
```go
242+
func decrypt(code []int, k int) []int {
243+
n := len(code)
244+
ans := make([]int, n)
245+
if k == 0 {
246+
return ans
247+
}
248+
for i := 0; i < n; i++ {
249+
if k > 0 {
250+
for j := i + 1; j < i+k+1; j++ {
251+
ans[i] += code[j%n]
252+
}
253+
} else {
254+
for j := i + k; j < i; j++ {
255+
ans[i] += code[(j+n)%n]
256+
}
257+
}
258+
}
259+
return ans
260+
}
261+
```
262+
263+
```go
264+
func decrypt(code []int, k int) []int {
265+
n := len(code)
266+
ans := make([]int, n)
267+
if k == 0 {
268+
return ans
269+
}
270+
s := make([]int, n<<1|1)
271+
for i := 0; i < n<<1; i++ {
272+
s[i+1] = s[i] + code[i%n]
273+
}
274+
for i := range code {
275+
if k > 0 {
276+
ans[i] = s[i+k+1] - s[i+1]
277+
} else {
278+
ans[i] = s[i+n] - s[i+k+n]
279+
}
280+
}
281+
return ans
282+
}
283+
```
284+
115285
### **...**
116286

117287
```

0 commit comments

Comments
 (0)