Skip to content

Commit d56ace5

Browse files
authored
feat: update solutions to lc problem: No.2834 (doocs#2414)
No.2834.Find the Minimum Possible Sum of a Beautiful Array
1 parent 7cb44df commit d56ace5

File tree

7 files changed

+116
-177
lines changed

7 files changed

+116
-177
lines changed

solution/2800-2899/2834.Find the Minimum Possible Sum of a Beautiful Array/README.md

+41-60
Original file line numberDiff line numberDiff line change
@@ -64,99 +64,80 @@ nums = [1,3,4] 是美丽数组。
6464

6565
## 解法
6666

67-
### 方法一:贪心 + 哈希表
67+
### 方法一:贪心 + 数学
6868

69-
我们从正整数 $i=1$ 开始,依次判断 $i$ 是否可以加入数组中,如果可以加入,则将 $i$ 加入数组中,累加到答案中,然后将 $target-i$ 置为已访问,表示 $target-i$ 不能加入数组中。循环直到数组长度为 $n$。
69+
我们可以贪心地从 $x = 1$ 开始构造数组 $nums$,每次选择 $x$,并且排除 $target - x$。
7070

71-
时间复杂度 $O(n + target)$,空间复杂度 $O(n + target)$。其中 $n$ 为数组长度。
71+
如果 $x <= \left\lfloor \frac{target}{2} \right\rfloor$,那么我们可以选择的数字分别为 $1, 2, \cdots, n$,因此,数组的和为 $\left\lfloor \frac{n(n+1)}{2} \right\rfloor$。
72+
73+
如果 $x > \left\lfloor \frac{target}{2} \right\rfloor$,那么我们可以选择的数字分别为 $1, 2, \cdots, \left\lfloor \frac{target}{2} \right\rfloor$,共 $\left\lfloor \frac{target}{2} \right\rfloor$ 个数,以及从 $target$ 开始的 $n - \left\lfloor \frac{target}{2} \right\rfloor$ 个数字,因此,数组的和为 $\left\lfloor \frac{\left\lfloor \frac{target}{2} \right\rfloor \left(\left\lfloor \frac{target}{2} \right\rfloor + 1\right)}{2} \right\rfloor + \left\lfloor \frac{target + target + n - \left\lfloor \frac{target}{2} \right\rfloor - 1}{2} \right\rfloor$。
74+
75+
时间复杂度 $O(1)$,空间复杂度 $O(1)$。
7276

7377
<!-- tabs:start -->
7478

7579
```python
7680
class Solution:
7781
def minimumPossibleSum(self, n: int, target: int) -> int:
78-
vis = set()
79-
ans = 0
80-
i = 1
81-
for _ in range(n):
82-
while i in vis:
83-
i += 1
84-
ans += i
85-
vis.add(target - i)
86-
i += 1
87-
return ans
82+
mod = 10**9 + 7
83+
m = target // 2
84+
if n <= m:
85+
return ((1 + n) * n // 2) % mod
86+
return ((1 + m) * m // 2 + (target + target + n - m - 1) * (n - m) // 2) % mod
8887
```
8988

9089
```java
9190
class Solution {
92-
public long minimumPossibleSum(int n, int target) {
93-
boolean[] vis = new boolean[n + target];
94-
long ans = 0;
95-
for (int i = 1; n > 0; --n, ++i) {
96-
while (vis[i]) {
97-
++i;
98-
}
99-
ans += i;
100-
if (target >= i) {
101-
vis[target - i] = true;
102-
}
91+
public int minimumPossibleSum(int n, int target) {
92+
final int mod = (int) 1e9 + 7;
93+
int m = target / 2;
94+
if (n <= m) {
95+
return (int) ((1L + n) * n / 2 % mod);
10396
}
104-
return ans;
97+
long a = (1L + m) * m / 2 % mod;
98+
long b = ((1L * target + target + n - m - 1) * (n - m) / 2) % mod;
99+
return (int) ((a + b) % mod);
105100
}
106101
}
107102
```
108103

109104
```cpp
110105
class Solution {
111106
public:
112-
long long minimumPossibleSum(int n, int target) {
113-
bool vis[n + target];
114-
memset(vis, false, sizeof(vis));
115-
long long ans = 0;
116-
for (int i = 1; n; ++i, --n) {
117-
while (vis[i]) {
118-
++i;
119-
}
120-
ans += i;
121-
if (target >= i) {
122-
vis[target - i] = true;
123-
}
107+
int minimumPossibleSum(int n, int target) {
108+
const int mod = 1e9 + 7;
109+
int m = target / 2;
110+
if (n <= m) {
111+
return (1LL + n) * n / 2 % mod;
124112
}
125-
return ans;
113+
long long a = (1LL + m) * m / 2 % mod;
114+
long long b = (1LL * target + target + n - m - 1) * (n - m) / 2 % mod;
115+
return (a + b) % mod;
126116
}
127117
};
128118
```
129119
130120
```go
131-
func minimumPossibleSum(n int, target int) (ans int64) {
132-
vis := make([]bool, n+target)
133-
for i := 1; n > 0; i, n = i+1, n-1 {
134-
for vis[i] {
135-
i++
136-
}
137-
ans += int64(i)
138-
if target >= i {
139-
vis[target-i] = true
140-
}
121+
func minimumPossibleSum(n int, target int) int {
122+
const mod int = 1e9 + 7
123+
m := target / 2
124+
if n <= m {
125+
return (n + 1) * n / 2 % mod
141126
}
142-
return
127+
a := (m + 1) * m / 2 % mod
128+
b := (target + target + n - m - 1) * (n - m) / 2 % mod
129+
return (a + b) % mod
143130
}
144131
```
145132

146133
```ts
147134
function minimumPossibleSum(n: number, target: number): number {
148-
const vis: boolean[] = Array(n + target).fill(false);
149-
let ans = 0;
150-
for (let i = 1; n; ++i, --n) {
151-
while (vis[i]) {
152-
++i;
153-
}
154-
ans += i;
155-
if (target >= i) {
156-
vis[target - i] = true;
157-
}
135+
const mod = 10 ** 9 + 7;
136+
const m = target >> 1;
137+
if (n <= m) {
138+
return (((1 + n) * n) / 2) % mod;
158139
}
159-
return ans;
140+
return (((1 + m) * m) / 2 + ((target + target + n - m - 1) * (n - m)) / 2) % mod;
160141
}
161142
```
162143

solution/2800-2899/2834.Find the Minimum Possible Sum of a Beautiful Array/README_EN.md

+41-60
Original file line numberDiff line numberDiff line change
@@ -61,99 +61,80 @@ It can be proven that 8 is the minimum possible sum that a beautiful array could
6161

6262
## Solutions
6363

64-
### Solution 1: Greedy + Hash Table
64+
### Solution 1: Greedy + Mathematics
6565

66-
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 $target-i$ as visited, indicating that $target-i$ cannot be added to the array. The loop continues until the length of the array is $n$.
66+
We can greedily construct the array `nums` starting from $x = 1$, choosing $x$ each time and excluding $target - x$.
6767

68-
The time complexity is $O(n + target)$, and the space complexity is $O(n + target)$. Here, $n$ is the length of the array.
68+
If $x <= \left\lfloor \frac{target}{2} \right\rfloor$, then the numbers we can choose are $1, 2, \cdots, n$, so the sum of the array is $\left\lfloor \frac{n(n+1)}{2} \right\rfloor$.
69+
70+
If $x > \left\lfloor \frac{target}{2} \right\rfloor$, then the numbers we can choose are $1, 2, \cdots, \left\lfloor \frac{target}{2} \right\rfloor$, a total of $\left\lfloor \frac{target}{2} \right\rfloor$ numbers, and $n - \left\lfloor \frac{target}{2} \right\rfloor$ numbers starting from $target$, so the sum of the array is $\left\lfloor \frac{\left\lfloor \frac{target}{2} \right\rfloor \left(\left\lfloor \frac{target}{2} \right\rfloor + 1\right)}{2} \right\rfloor + \left\lfloor \frac{target + target + n - \left\lfloor \frac{target}{2} \right\rfloor - 1}{2} \right\rfloor$.
71+
72+
The time complexity is $O(1)$, and the space complexity is $O(1)$.
6973

7074
<!-- tabs:start -->
7175

7276
```python
7377
class Solution:
7478
def minimumPossibleSum(self, n: int, target: int) -> int:
75-
vis = set()
76-
ans = 0
77-
i = 1
78-
for _ in range(n):
79-
while i in vis:
80-
i += 1
81-
ans += i
82-
vis.add(target - i)
83-
i += 1
84-
return ans
79+
mod = 10**9 + 7
80+
m = target // 2
81+
if n <= m:
82+
return ((1 + n) * n // 2) % mod
83+
return ((1 + m) * m // 2 + (target + target + n - m - 1) * (n - m) // 2) % mod
8584
```
8685

8786
```java
8887
class Solution {
89-
public long minimumPossibleSum(int n, int target) {
90-
boolean[] vis = new boolean[n + target];
91-
long ans = 0;
92-
for (int i = 1; n > 0; --n, ++i) {
93-
while (vis[i]) {
94-
++i;
95-
}
96-
ans += i;
97-
if (target >= i) {
98-
vis[target - i] = true;
99-
}
88+
public int minimumPossibleSum(int n, int target) {
89+
final int mod = (int) 1e9 + 7;
90+
int m = target / 2;
91+
if (n <= m) {
92+
return (int) ((1L + n) * n / 2 % mod);
10093
}
101-
return ans;
94+
long a = (1L + m) * m / 2 % mod;
95+
long b = ((1L * target + target + n - m - 1) * (n - m) / 2) % mod;
96+
return (int) ((a + b) % mod);
10297
}
10398
}
10499
```
105100

106101
```cpp
107102
class Solution {
108103
public:
109-
long long minimumPossibleSum(int n, int target) {
110-
bool vis[n + target];
111-
memset(vis, false, sizeof(vis));
112-
long long ans = 0;
113-
for (int i = 1; n; ++i, --n) {
114-
while (vis[i]) {
115-
++i;
116-
}
117-
ans += i;
118-
if (target >= i) {
119-
vis[target - i] = true;
120-
}
104+
int minimumPossibleSum(int n, int target) {
105+
const int mod = 1e9 + 7;
106+
int m = target / 2;
107+
if (n <= m) {
108+
return (1LL + n) * n / 2 % mod;
121109
}
122-
return ans;
110+
long long a = (1LL + m) * m / 2 % mod;
111+
long long b = (1LL * target + target + n - m - 1) * (n - m) / 2 % mod;
112+
return (a + b) % mod;
123113
}
124114
};
125115
```
126116
127117
```go
128-
func minimumPossibleSum(n int, target int) (ans int64) {
129-
vis := make([]bool, n+target)
130-
for i := 1; n > 0; i, n = i+1, n-1 {
131-
for vis[i] {
132-
i++
133-
}
134-
ans += int64(i)
135-
if target >= i {
136-
vis[target-i] = true
137-
}
118+
func minimumPossibleSum(n int, target int) int {
119+
const mod int = 1e9 + 7
120+
m := target / 2
121+
if n <= m {
122+
return (n + 1) * n / 2 % mod
138123
}
139-
return
124+
a := (m + 1) * m / 2 % mod
125+
b := (target + target + n - m - 1) * (n - m) / 2 % mod
126+
return (a + b) % mod
140127
}
141128
```
142129

143130
```ts
144131
function minimumPossibleSum(n: number, target: number): number {
145-
const vis: boolean[] = Array(n + target).fill(false);
146-
let ans = 0;
147-
for (let i = 1; n; ++i, --n) {
148-
while (vis[i]) {
149-
++i;
150-
}
151-
ans += i;
152-
if (target >= i) {
153-
vis[target - i] = true;
154-
}
132+
const mod = 10 ** 9 + 7;
133+
const m = target >> 1;
134+
if (n <= m) {
135+
return (((1 + n) * n) / 2) % mod;
155136
}
156-
return ans;
137+
return (((1 + m) * m) / 2 + ((target + target + n - m - 1) * (n - m)) / 2) % mod;
157138
}
158139
```
159140

Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
class Solution {
22
public:
3-
long long minimumPossibleSum(int n, int target) {
4-
bool vis[n + target];
5-
memset(vis, false, sizeof(vis));
6-
long long ans = 0;
7-
for (int i = 1; n; ++i, --n) {
8-
while (vis[i]) {
9-
++i;
10-
}
11-
ans += i;
12-
if (target >= i) {
13-
vis[target - i] = true;
14-
}
3+
int minimumPossibleSum(int n, int target) {
4+
const int mod = 1e9 + 7;
5+
int m = target / 2;
6+
if (n <= m) {
7+
return (1LL + n) * n / 2 % mod;
158
}
16-
return ans;
9+
long long a = (1LL + m) * m / 2 % mod;
10+
long long b = (1LL * target + target + n - m - 1) * (n - m) / 2 % mod;
11+
return (a + b) % mod;
1712
}
1813
};
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
func minimumPossibleSum(n int, target int) (ans int64) {
2-
vis := make([]bool, n+target)
3-
for i := 1; n > 0; i, n = i+1, n-1 {
4-
for vis[i] {
5-
i++
6-
}
7-
ans += int64(i)
8-
if target >= i {
9-
vis[target-i] = true
10-
}
1+
func minimumPossibleSum(n int, target int) int {
2+
const mod int = 1e9 + 7
3+
m := target / 2
4+
if n <= m {
5+
return (n + 1) * n / 2 % mod
116
}
12-
return
7+
a := (m + 1) * m / 2 % mod
8+
b := (target + target + n - m - 1) * (n - m) / 2 % mod
9+
return (a + b) % mod
1310
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
class Solution {
2-
public long minimumPossibleSum(int n, int target) {
3-
boolean[] vis = new boolean[n + target];
4-
long ans = 0;
5-
for (int i = 1; n > 0; --n, ++i) {
6-
while (vis[i]) {
7-
++i;
8-
}
9-
ans += i;
10-
if (target >= i) {
11-
vis[target - i] = true;
12-
}
2+
public int minimumPossibleSum(int n, int target) {
3+
final int mod = (int) 1e9 + 7;
4+
int m = target / 2;
5+
if (n <= m) {
6+
return (int) ((1L + n) * n / 2 % mod);
137
}
14-
return ans;
8+
long a = (1L + m) * m / 2 % mod;
9+
long b = ((1L * target + target + n - m - 1) * (n - m) / 2) % mod;
10+
return (int) ((a + b) % mod);
1511
}
1612
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
class Solution:
22
def minimumPossibleSum(self, n: int, target: int) -> int:
3-
vis = set()
4-
ans = 0
5-
i = 1
6-
for _ in range(n):
7-
while i in vis:
8-
i += 1
9-
ans += i
10-
vis.add(target - i)
11-
i += 1
12-
return ans
3+
mod = 10**9 + 7
4+
m = target // 2
5+
if n <= m:
6+
return ((1 + n) * n // 2) % mod
7+
return ((1 + m) * m // 2 + (target + target + n - m - 1) * (n - m) // 2) % mod
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
function minimumPossibleSum(n: number, target: number): number {
2-
const vis: boolean[] = Array(n + target).fill(false);
3-
let ans = 0;
4-
for (let i = 1; n; ++i, --n) {
5-
while (vis[i]) {
6-
++i;
7-
}
8-
ans += i;
9-
if (target >= i) {
10-
vis[target - i] = true;
11-
}
2+
const mod = 10 ** 9 + 7;
3+
const m = target >> 1;
4+
if (n <= m) {
5+
return (((1 + n) * n) / 2) % mod;
126
}
13-
return ans;
7+
return (((1 + m) * m) / 2 + ((target + target + n - m - 1) * (n - m)) / 2) % mod;
148
}

0 commit comments

Comments
 (0)