Skip to content

Commit 4eba269

Browse files
authored
feat: add solutions to lc problem: No.2829 (#4156)
No.2829.Determine the Minimum Sum of a k-avoiding Array
1 parent a7d1e56 commit 4eba269

File tree

8 files changed

+96
-44
lines changed

8 files changed

+96
-44
lines changed

solution/2800-2899/2829.Determine the Minimum Sum of a k-avoiding Array/README.md

+34-15
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ tags:
4242
<strong>输入:</strong>n = 2, k = 6
4343
<strong>输出:</strong>3
4444
<strong>解释:</strong>可以构造数组 [1,2] ,其元素总和为 3 。
45-
可以证明不存在总和小于 3 的 k-avoiding 数组。
45+
可以证明不存在总和小于 3 的 k-avoiding 数组。
4646
</pre>
4747

4848
<p>&nbsp;</p>
@@ -61,9 +61,9 @@ tags:
6161

6262
### 方法一:贪心 + 模拟
6363

64-
我们从正整数 $i=1$ 开始,依次判断 $i$ 是否可以加入数组中,如果可以加入,则将 $i$ 加入数组中,累加到答案中,然后将 $k-i$ 置为已访问,表示 $k-i$ 不能加入数组中。循环直到数组长度为 $n$。
64+
我们从正整数 $i = 1$ 开始,依次判断 $i$ 是否可以加入数组中,如果可以加入,则将 $i$ 加入数组中,累加到答案中,然后将 $k - i$ 置为已访问,表示 $k-i$ 不能加入数组中。循环直到数组长度为 $n$。
6565

66-
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 为数组长度。
66+
时间复杂度 $O(n + k)$,空间复杂度 $O(n + k)$。其中 $n$ 为数组长度。
6767

6868
<!-- tabs:start -->
6969

@@ -77,9 +77,9 @@ class Solution:
7777
for _ in range(n):
7878
while i in vis:
7979
i += 1
80-
vis.add(i)
8180
vis.add(k - i)
8281
s += i
82+
i += 1
8383
return s
8484
```
8585

@@ -89,16 +89,15 @@ class Solution:
8989
class Solution {
9090
public int minimumSum(int n, int k) {
9191
int s = 0, i = 1;
92-
boolean[] vis = new boolean[k + n * n + 1];
92+
boolean[] vis = new boolean[n + k + 1];
9393
while (n-- > 0) {
9494
while (vis[i]) {
9595
++i;
9696
}
97-
vis[i] = true;
9897
if (k >= i) {
9998
vis[k - i] = true;
10099
}
101-
s += i;
100+
s += i++;
102101
}
103102
return s;
104103
}
@@ -112,17 +111,16 @@ class Solution {
112111
public:
113112
int minimumSum(int n, int k) {
114113
int s = 0, i = 1;
115-
bool vis[k + n * n + 1];
114+
bool vis[n + k + 1];
116115
memset(vis, false, sizeof(vis));
117116
while (n--) {
118117
while (vis[i]) {
119118
++i;
120119
}
121-
vis[i] = true;
122120
if (k >= i) {
123121
vis[k - i] = true;
124122
}
125-
s += i;
123+
s += i++;
126124
}
127125
return s;
128126
}
@@ -134,16 +132,16 @@ public:
134132
```go
135133
func minimumSum(n int, k int) int {
136134
s, i := 0, 1
137-
vis := make([]bool, k+n*n+1)
135+
vis := make([]bool, n+k+1)
138136
for ; n > 0; n-- {
139137
for vis[i] {
140138
i++
141139
}
142-
vis[i] = true
143140
if k >= i {
144141
vis[k-i] = true
145142
}
146143
s += i
144+
i++
147145
}
148146
return s
149147
}
@@ -155,21 +153,42 @@ func minimumSum(n int, k int) int {
155153
function minimumSum(n: number, k: number): number {
156154
let s = 0;
157155
let i = 1;
158-
const vis: boolean[] = Array(n * n + k + 1);
156+
const vis: boolean[] = Array(n + k + 1).fill(false);
159157
while (n--) {
160158
while (vis[i]) {
161159
++i;
162160
}
163-
vis[i] = true;
164161
if (k >= i) {
165162
vis[k - i] = true;
166163
}
167-
s += i;
164+
s += i++;
168165
}
169166
return s;
170167
}
171168
```
172169

170+
#### Rust
171+
172+
```rust
173+
impl Solution {
174+
pub fn minimum_sum(n: i32, k: i32) -> i32 {
175+
let (mut s, mut i) = (0, 1);
176+
let mut vis = std::collections::HashSet::new();
177+
178+
for _ in 0..n {
179+
while vis.contains(&i) {
180+
i += 1;
181+
}
182+
vis.insert(k - i);
183+
s += i;
184+
i += 1;
185+
}
186+
187+
s
188+
}
189+
}
190+
```
191+
173192
<!-- tabs:end -->
174193

175194
<!-- solution:end -->

solution/2800-2899/2829.Determine the Minimum Sum of a k-avoiding Array/README_EN.md

+33-14
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ It can be proven that there is no k-avoiding array with a sum less than 3.
5959

6060
### Solution 1: Greedy + Simulation
6161

62-
We start from the positive integer $i=1$, and judge whether $i$ can be added to the array in turn. If it can be added, we add $i$ to the array, accumulate it to the answer, and then mark $k-i$ as visited, indicating that $k-i$ cannot be added to the array. The loop continues until the length of the array is $n$.
62+
Starting from the positive integer $i = 1$, we sequentially determine if $i$ can be added to the array. If it can be added, we add $i$ to the array, accumulate it to the answer, and then mark $k - i$ as visited, indicating that $k-i$ cannot be added to the array. We continue this process until the array's length reaches $n$.
6363

64-
The time complexity is $O(n^2)$, and the space complexity is $O(n^2)$. Here, $n$ is the length of the array.
64+
The time complexity is $O(n + k)$, and the space complexity is $O(n + k)$. Where $n$ is the length of the array.
6565

6666
<!-- tabs:start -->
6767

@@ -75,9 +75,9 @@ class Solution:
7575
for _ in range(n):
7676
while i in vis:
7777
i += 1
78-
vis.add(i)
7978
vis.add(k - i)
8079
s += i
80+
i += 1
8181
return s
8282
```
8383

@@ -87,16 +87,15 @@ class Solution:
8787
class Solution {
8888
public int minimumSum(int n, int k) {
8989
int s = 0, i = 1;
90-
boolean[] vis = new boolean[k + n * n + 1];
90+
boolean[] vis = new boolean[n + k + 1];
9191
while (n-- > 0) {
9292
while (vis[i]) {
9393
++i;
9494
}
95-
vis[i] = true;
9695
if (k >= i) {
9796
vis[k - i] = true;
9897
}
99-
s += i;
98+
s += i++;
10099
}
101100
return s;
102101
}
@@ -110,17 +109,16 @@ class Solution {
110109
public:
111110
int minimumSum(int n, int k) {
112111
int s = 0, i = 1;
113-
bool vis[k + n * n + 1];
112+
bool vis[n + k + 1];
114113
memset(vis, false, sizeof(vis));
115114
while (n--) {
116115
while (vis[i]) {
117116
++i;
118117
}
119-
vis[i] = true;
120118
if (k >= i) {
121119
vis[k - i] = true;
122120
}
123-
s += i;
121+
s += i++;
124122
}
125123
return s;
126124
}
@@ -132,16 +130,16 @@ public:
132130
```go
133131
func minimumSum(n int, k int) int {
134132
s, i := 0, 1
135-
vis := make([]bool, k+n*n+1)
133+
vis := make([]bool, n+k+1)
136134
for ; n > 0; n-- {
137135
for vis[i] {
138136
i++
139137
}
140-
vis[i] = true
141138
if k >= i {
142139
vis[k-i] = true
143140
}
144141
s += i
142+
i++
145143
}
146144
return s
147145
}
@@ -153,21 +151,42 @@ func minimumSum(n int, k int) int {
153151
function minimumSum(n: number, k: number): number {
154152
let s = 0;
155153
let i = 1;
156-
const vis: boolean[] = Array(n * n + k + 1);
154+
const vis: boolean[] = Array(n + k + 1).fill(false);
157155
while (n--) {
158156
while (vis[i]) {
159157
++i;
160158
}
161-
vis[i] = true;
162159
if (k >= i) {
163160
vis[k - i] = true;
164161
}
165-
s += i;
162+
s += i++;
166163
}
167164
return s;
168165
}
169166
```
170167

168+
#### Rust
169+
170+
```rust
171+
impl Solution {
172+
pub fn minimum_sum(n: i32, k: i32) -> i32 {
173+
let (mut s, mut i) = (0, 1);
174+
let mut vis = std::collections::HashSet::new();
175+
176+
for _ in 0..n {
177+
while vis.contains(&i) {
178+
i += 1;
179+
}
180+
vis.insert(k - i);
181+
s += i;
182+
i += 1;
183+
}
184+
185+
s
186+
}
187+
}
188+
```
189+
171190
<!-- tabs:end -->
172191

173192
<!-- solution:end -->

solution/2800-2899/2829.Determine the Minimum Sum of a k-avoiding Array/Solution.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@ class Solution {
22
public:
33
int minimumSum(int n, int k) {
44
int s = 0, i = 1;
5-
bool vis[k + n * n + 1];
5+
bool vis[n + k + 1];
66
memset(vis, false, sizeof(vis));
77
while (n--) {
88
while (vis[i]) {
99
++i;
1010
}
11-
vis[i] = true;
1211
if (k >= i) {
1312
vis[k - i] = true;
1413
}
15-
s += i;
14+
s += i++;
1615
}
1716
return s;
1817
}
19-
};
18+
};
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
func minimumSum(n int, k int) int {
22
s, i := 0, 1
3-
vis := make([]bool, k+n*n+1)
3+
vis := make([]bool, n+k+1)
44
for ; n > 0; n-- {
55
for vis[i] {
66
i++
77
}
8-
vis[i] = true
98
if k >= i {
109
vis[k-i] = true
1110
}
1211
s += i
12+
i++
1313
}
1414
return s
15-
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
class Solution {
22
public int minimumSum(int n, int k) {
33
int s = 0, i = 1;
4-
boolean[] vis = new boolean[k + n * n + 1];
4+
boolean[] vis = new boolean[n + k + 1];
55
while (n-- > 0) {
66
while (vis[i]) {
77
++i;
88
}
9-
vis[i] = true;
109
if (k >= i) {
1110
vis[k - i] = true;
1211
}
13-
s += i;
12+
s += i++;
1413
}
1514
return s;
1615
}
17-
}
16+
}

solution/2800-2899/2829.Determine the Minimum Sum of a k-avoiding Array/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ def minimumSum(self, n: int, k: int) -> int:
55
for _ in range(n):
66
while i in vis:
77
i += 1
8-
vis.add(i)
98
vis.add(k - i)
109
s += i
10+
i += 1
1111
return s
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
impl Solution {
2+
pub fn minimum_sum(n: i32, k: i32) -> i32 {
3+
let (mut s, mut i) = (0, 1);
4+
let mut vis = std::collections::HashSet::new();
5+
6+
for _ in 0..n {
7+
while vis.contains(&i) {
8+
i += 1;
9+
}
10+
vis.insert(k - i);
11+
s += i;
12+
i += 1;
13+
}
14+
15+
s
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
function minimumSum(n: number, k: number): number {
22
let s = 0;
33
let i = 1;
4-
const vis: boolean[] = Array(n * n + k + 1);
4+
const vis: boolean[] = Array(n + k + 1).fill(false);
55
while (n--) {
66
while (vis[i]) {
77
++i;
88
}
9-
vis[i] = true;
109
if (k >= i) {
1110
vis[k - i] = true;
1211
}
13-
s += i;
12+
s += i++;
1413
}
1514
return s;
1615
}

0 commit comments

Comments
 (0)