Skip to content

Commit 5e10711

Browse files
authored
Merge branch 'doocs:main' into main
2 parents fd78ade + 891dc6e commit 5e10711

File tree

20 files changed

+2295
-225
lines changed

20 files changed

+2295
-225
lines changed

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

Lines changed: 59 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -64,99 +64,99 @@ 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+
我们不妨记 $m = \left\lfloor \frac{target}{2} \right\rfloor$。
72+
73+
如果 $x <= m$,那么我们可以选择的数有 $1, 2, \cdots, n$,所以数组的和为 $\left\lfloor \frac{(1+n)n}{2} \right\rfloor$。
74+
75+
如果 $x > m$,那么我们可以选择的数有 $1, 2, \cdots, m$,共 $m$ 个数,以及 $n - m$ 个从 $target$ 开始的数,所以数组的和为 $\left\lfloor \frac{(1+m)m}{2} \right\rfloor + \left\lfloor \frac{(target + target + n - m - 1)(n-m)}{2} \right\rfloor$。
76+
77+
注意,我们需要对结果取模 $10^9 + 7$。
78+
79+
时间复杂度 $O(1)$,空间复杂度 $O(1)$。
7280

7381
<!-- tabs:start -->
7482

7583
```python
7684
class Solution:
7785
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
86+
mod = 10**9 + 7
87+
m = target // 2
88+
if n <= m:
89+
return ((1 + n) * n // 2) % mod
90+
return ((1 + m) * m // 2 + (target + target + n - m - 1) * (n - m) // 2) % mod
8891
```
8992

9093
```java
9194
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-
}
95+
public int minimumPossibleSum(int n, int target) {
96+
final int mod = (int) 1e9 + 7;
97+
int m = target / 2;
98+
if (n <= m) {
99+
return (int) ((1L + n) * n / 2 % mod);
103100
}
104-
return ans;
101+
long a = (1L + m) * m / 2 % mod;
102+
long b = ((1L * target + target + n - m - 1) * (n - m) / 2) % mod;
103+
return (int) ((a + b) % mod);
105104
}
106105
}
107106
```
108107

109108
```cpp
110109
class Solution {
111110
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-
}
111+
int minimumPossibleSum(int n, int target) {
112+
const int mod = 1e9 + 7;
113+
int m = target / 2;
114+
if (n <= m) {
115+
return (1LL + n) * n / 2 % mod;
124116
}
125-
return ans;
117+
long long a = (1LL + m) * m / 2 % mod;
118+
long long b = (1LL * target + target + n - m - 1) * (n - m) / 2 % mod;
119+
return (a + b) % mod;
126120
}
127121
};
128122
```
129123
130124
```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-
}
125+
func minimumPossibleSum(n int, target int) int {
126+
const mod int = 1e9 + 7
127+
m := target / 2
128+
if n <= m {
129+
return (n + 1) * n / 2 % mod
141130
}
142-
return
131+
a := (m + 1) * m / 2 % mod
132+
b := (target + target + n - m - 1) * (n - m) / 2 % mod
133+
return (a + b) % mod
143134
}
144135
```
145136

146137
```ts
147138
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;
139+
const mod = 10 ** 9 + 7;
140+
const m = target >> 1;
141+
if (n <= m) {
142+
return (((1 + n) * n) / 2) % mod;
143+
}
144+
return (((1 + m) * m) / 2 + ((target + target + n - m - 1) * (n - m)) / 2) % mod;
145+
}
146+
```
147+
148+
```cs
149+
public class Solution {
150+
public int MinimumPossibleSum(int n, int target) {
151+
const int mod = (int) 1e9 + 7;
152+
int m = target / 2;
153+
if (n <= m) {
154+
return (int) ((1L + n) * n / 2 % mod);
157155
}
156+
long a = (1L + m) * m / 2 % mod;
157+
long b = ((1L * target + target + n - m - 1) * (n - m) / 2) % mod;
158+
return (int) ((a + b) % mod);
158159
}
159-
return ans;
160160
}
161161
```
162162

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

Lines changed: 59 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -61,99 +61,99 @@ 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+
Let's denote $m = \left\lfloor \frac{target}{2} \right\rfloor$.
69+
70+
If $x <= m$, then the numbers we can choose are $1, 2, \cdots, n$, so the sum of the array is $\left\lfloor \frac{(1+n)n}{2} \right\rfloor$.
71+
72+
If $x > m$, then the numbers we can choose are $1, 2, \cdots, m$, a total of $m$ numbers, and $n - m$ numbers starting from $target$, so the sum of the array is $\left\lfloor \frac{(1+m)m}{2} \right\rfloor + \left\lfloor \frac{(target + target + n - m - 1)(n-m)}{2} \right\rfloor$.
73+
74+
Note that we need to take the modulus of $10^9 + 7$ for the result.
75+
76+
The time complexity is $O(1)$, and the space complexity is $O(1)$.
6977

7078
<!-- tabs:start -->
7179

7280
```python
7381
class Solution:
7482
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
83+
mod = 10**9 + 7
84+
m = target // 2
85+
if n <= m:
86+
return ((1 + n) * n // 2) % mod
87+
return ((1 + m) * m // 2 + (target + target + n - m - 1) * (n - m) // 2) % mod
8588
```
8689

8790
```java
8891
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-
}
92+
public int minimumPossibleSum(int n, int target) {
93+
final int mod = (int) 1e9 + 7;
94+
int m = target / 2;
95+
if (n <= m) {
96+
return (int) ((1L + n) * n / 2 % mod);
10097
}
101-
return ans;
98+
long a = (1L + m) * m / 2 % mod;
99+
long b = ((1L * target + target + n - m - 1) * (n - m) / 2) % mod;
100+
return (int) ((a + b) % mod);
102101
}
103102
}
104103
```
105104

106105
```cpp
107106
class Solution {
108107
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-
}
108+
int minimumPossibleSum(int n, int target) {
109+
const int mod = 1e9 + 7;
110+
int m = target / 2;
111+
if (n <= m) {
112+
return (1LL + n) * n / 2 % mod;
121113
}
122-
return ans;
114+
long long a = (1LL + m) * m / 2 % mod;
115+
long long b = (1LL * target + target + n - m - 1) * (n - m) / 2 % mod;
116+
return (a + b) % mod;
123117
}
124118
};
125119
```
126120
127121
```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-
}
122+
func minimumPossibleSum(n int, target int) int {
123+
const mod int = 1e9 + 7
124+
m := target / 2
125+
if n <= m {
126+
return (n + 1) * n / 2 % mod
138127
}
139-
return
128+
a := (m + 1) * m / 2 % mod
129+
b := (target + target + n - m - 1) * (n - m) / 2 % mod
130+
return (a + b) % mod
140131
}
141132
```
142133

143134
```ts
144135
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;
136+
const mod = 10 ** 9 + 7;
137+
const m = target >> 1;
138+
if (n <= m) {
139+
return (((1 + n) * n) / 2) % mod;
140+
}
141+
return (((1 + m) * m) / 2 + ((target + target + n - m - 1) * (n - m)) / 2) % mod;
142+
}
143+
```
144+
145+
```cs
146+
public class Solution {
147+
public int MinimumPossibleSum(int n, int target) {
148+
const int mod = (int) 1e9 + 7;
149+
int m = target / 2;
150+
if (n <= m) {
151+
return (int) ((1L + n) * n / 2 % mod);
154152
}
153+
long a = (1L + m) * m / 2 % mod;
154+
long b = ((1L * target + target + n - m - 1) * (n - m) / 2) % mod;
155+
return (int) ((a + b) % mod);
155156
}
156-
return ans;
157157
}
158158
```
159159

Lines changed: 8 additions & 13 deletions
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
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
public class Solution {
2+
public int MinimumPossibleSum(int n, int target) {
3+
const int mod = (int) 1e9 + 7;
4+
int m = target / 2;
5+
if (n <= m) {
6+
return (int) ((1L + n) * n / 2 % mod);
7+
}
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);
11+
}
12+
}
Lines changed: 8 additions & 11 deletions
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
}

0 commit comments

Comments
 (0)