Skip to content

Commit bbbf305

Browse files
authored
feat: add solutions to lc problem: No.3698 (doocs#4771)
1 parent 995a784 commit bbbf305

File tree

7 files changed

+532
-8
lines changed

7 files changed

+532
-8
lines changed

solution/3600-3699/3698.Split Array With Minimum Difference/README.md

Lines changed: 181 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,32 +159,209 @@ source: 第 469 场周赛 Q2
159159

160160
<!-- solution:start -->
161161

162-
### 方法一
162+
### 方法一: 前缀和 + 双数组记录单调性
163+
164+
我们用一个前缀和数组 $s$ 来记录数组的前缀和,其中 $s[i]$ 表示数组 $[0,..i]$ 的和。然后我们用两个布尔数组 $f$ 和 $g$ 来分别记录前缀和后缀的单调性,其中 $f[i]$ 表示数组 $[0,..i]$ 是否严格递增,而 $g[i]$ 表示数组 $[i,..n-1]$ 是否严格递减。
165+
166+
最后,我们遍历数组位置 $i$,其中 $0 \leq i < n-1$,如果 $f[i]$ 和 $g[i+1]$ 都为真,那么我们就可以计算出 $left$ 和 $right$ 的和,分别为 $s[i]$ 和 $s[n-1]-s[i]$,并更新答案。
167+
168+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组的长度。
163169

164170
<!-- tabs:start -->
165171

166172
#### Python3
167173

168174
```python
169-
175+
class Solution:
176+
def splitArray(self, nums: List[int]) -> int:
177+
s = list(accumulate(nums))
178+
n = len(nums)
179+
f = [True] * n
180+
for i in range(1, n):
181+
f[i] = f[i - 1]
182+
if nums[i] <= nums[i - 1]:
183+
f[i] = False
184+
g = [True] * n
185+
for i in range(n - 2, -1, -1):
186+
g[i] = g[i + 1]
187+
if nums[i] <= nums[i + 1]:
188+
g[i] = False
189+
ans = inf
190+
for i in range(n - 1):
191+
if f[i] and g[i + 1]:
192+
s1 = s[i]
193+
s2 = s[n - 1] - s[i]
194+
ans = min(ans, abs(s1 - s2))
195+
return ans if ans < inf else -1
170196
```
171197

172198
#### Java
173199

174200
```java
175-
201+
class Solution {
202+
public long splitArray(int[] nums) {
203+
int n = nums.length;
204+
long[] s = new long[n];
205+
s[0] = nums[0];
206+
boolean[] f = new boolean[n];
207+
Arrays.fill(f, true);
208+
boolean[] g = new boolean[n];
209+
Arrays.fill(g, true);
210+
for (int i = 1; i < n; ++i) {
211+
s[i] = s[i - 1] + nums[i];
212+
f[i] = f[i - 1];
213+
if (nums[i] <= nums[i - 1]) {
214+
f[i] = false;
215+
}
216+
}
217+
for (int i = n - 2; i >= 0; --i) {
218+
g[i] = g[i + 1];
219+
if (nums[i] <= nums[i + 1]) {
220+
g[i] = false;
221+
}
222+
}
223+
final long inf = Long.MAX_VALUE;
224+
long ans = inf;
225+
for (int i = 0; i < n - 1; ++i) {
226+
if (f[i] && g[i + 1]) {
227+
long s1 = s[i];
228+
long s2 = s[n - 1] - s[i];
229+
ans = Math.min(ans, Math.abs(s1 - s2));
230+
}
231+
}
232+
return ans < inf ? ans : -1;
233+
}
234+
}
176235
```
177236

178237
#### C++
179238

180239
```cpp
181-
240+
class Solution {
241+
public:
242+
long long splitArray(vector<int>& nums) {
243+
int n = nums.size();
244+
vector<long long> s(n);
245+
s[0] = nums[0];
246+
vector<bool> f(n, true), g(n, true);
247+
248+
for (int i = 1; i < n; ++i) {
249+
s[i] = s[i - 1] + nums[i];
250+
f[i] = f[i - 1];
251+
if (nums[i] <= nums[i - 1]) {
252+
f[i] = false;
253+
}
254+
}
255+
for (int i = n - 2; i >= 0; --i) {
256+
g[i] = g[i + 1];
257+
if (nums[i] <= nums[i + 1]) {
258+
g[i] = false;
259+
}
260+
}
261+
262+
const long long inf = LLONG_MAX;
263+
long long ans = inf;
264+
for (int i = 0; i < n - 1; ++i) {
265+
if (f[i] && g[i + 1]) {
266+
long long s1 = s[i];
267+
long long s2 = s[n - 1] - s[i];
268+
ans = min(ans, llabs(s1 - s2));
269+
}
270+
}
271+
return ans < inf ? ans : -1;
272+
}
273+
};
182274
```
183275

184276
#### Go
185277

186278
```go
279+
func splitArray(nums []int) int64 {
280+
n := len(nums)
281+
s := make([]int64, n)
282+
f := make([]bool, n)
283+
g := make([]bool, n)
284+
for i := range f {
285+
f[i] = true
286+
g[i] = true
287+
}
288+
289+
s[0] = int64(nums[0])
290+
for i := 1; i < n; i++ {
291+
s[i] = s[i-1] + int64(nums[i])
292+
f[i] = f[i-1]
293+
if nums[i] <= nums[i-1] {
294+
f[i] = false
295+
}
296+
}
297+
for i := n - 2; i >= 0; i-- {
298+
g[i] = g[i+1]
299+
if nums[i] <= nums[i+1] {
300+
g[i] = false
301+
}
302+
}
303+
304+
const inf = int64(^uint64(0) >> 1)
305+
ans := inf
306+
for i := 0; i < n-1; i++ {
307+
if f[i] && g[i+1] {
308+
s1 := s[i]
309+
s2 := s[n-1] - s[i]
310+
ans = min(ans, abs(s1-s2))
311+
}
312+
}
313+
if ans < inf {
314+
return ans
315+
}
316+
return -1
317+
}
318+
319+
func abs(x int64) int64 {
320+
if x < 0 {
321+
return -x
322+
}
323+
return x
324+
}
325+
```
187326

327+
#### TypeScript
328+
329+
```ts
330+
function splitArray(nums: number[]): number {
331+
const n = nums.length;
332+
const s: number[] = Array(n);
333+
const f: boolean[] = Array(n).fill(true);
334+
const g: boolean[] = Array(n).fill(true);
335+
336+
s[0] = nums[0];
337+
for (let i = 1; i < n; ++i) {
338+
s[i] = s[i - 1] + nums[i];
339+
f[i] = f[i - 1];
340+
if (nums[i] <= nums[i - 1]) {
341+
f[i] = false;
342+
}
343+
}
344+
345+
for (let i = n - 2; i >= 0; --i) {
346+
g[i] = g[i + 1];
347+
if (nums[i] <= nums[i + 1]) {
348+
g[i] = false;
349+
}
350+
}
351+
352+
const INF = Number.MAX_SAFE_INTEGER;
353+
let ans = INF;
354+
355+
for (let i = 0; i < n - 1; ++i) {
356+
if (f[i] && g[i + 1]) {
357+
const s1 = s[i];
358+
const s2 = s[n - 1] - s[i];
359+
ans = Math.min(ans, Math.abs(s1 - s2));
360+
}
361+
}
362+
363+
return ans < INF ? ans : -1;
364+
}
188365
```
189366

190367
<!-- tabs:end -->

0 commit comments

Comments
 (0)