Skip to content

Commit beb9c17

Browse files
committed
feat: add solutions to lc problem: No.0548
No.0548.Split Array with Equal Sum
1 parent 9b2116b commit beb9c17

File tree

6 files changed

+264
-2
lines changed

6 files changed

+264
-2
lines changed

solution/0500-0599/0548.Split Array with Equal Sum/README.md

+99-1
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,120 @@ sum(k + 1, n - 1) = sum(6, 6) = 1
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45+
前缀和 + 哈希表。
46+
47+
先求出前缀和数组 s。
48+
49+
然后遍历 j 所有可能的位置,对于每个 j,找出 i,使得前两个子数组的和相等。同时将和添加到哈希表中。
50+
51+
接着对于每个 j,找出 k,使得后两个子数组的和相等,然后判断哈希表中是否存在该和,如果存在,则找到满足条件的三元组 `(i, j, k)`,返回 true。
52+
53+
否则遍历结束返回 false。
54+
55+
时间复杂度 O(n²)。
56+
4557
<!-- tabs:start -->
4658

4759
### **Python3**
4860

4961
<!-- 这里可写当前语言的特殊实现逻辑 -->
5062

5163
```python
52-
64+
class Solution:
65+
def splitArray(self, nums: List[int]) -> bool:
66+
n = len(nums)
67+
s = [0] * (n + 1)
68+
for i, v in enumerate(nums):
69+
s[i + 1] = s[i] + v
70+
for j in range(3, n - 3):
71+
seen = set()
72+
for i in range(1, j - 1):
73+
if s[i] == s[j] - s[i + 1]:
74+
seen.add(s[i])
75+
for k in range(j + 2, n - 1):
76+
if s[n] - s[k + 1] == s[k] - s[j + 1] and s[n] - s[k + 1] in seen:
77+
return True
78+
return False
5379
```
5480

5581
### **Java**
5682

5783
<!-- 这里可写当前语言的特殊实现逻辑 -->
5884

5985
```java
86+
class Solution {
87+
public boolean splitArray(int[] nums) {
88+
int n = nums.length;
89+
int[] s = new int[n + 1];
90+
for (int i = 0; i < n; ++i) {
91+
s[i + 1] = s[i] + nums[i];
92+
}
93+
for (int j = 3; j < n - 3; ++j) {
94+
Set<Integer> seen = new HashSet<>();
95+
for (int i = 1; i < j - 1; ++i) {
96+
if (s[i] == s[j] - s[i + 1]) {
97+
seen.add(s[i]);
98+
}
99+
}
100+
for (int k = j + 2; k < n - 1; ++k) {
101+
if (s[n] - s[k + 1] == s[k] - s[j + 1] && seen.contains(s[n] - s[k + 1])) {
102+
return true;
103+
}
104+
}
105+
}
106+
return false;
107+
}
108+
}
109+
```
110+
111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
bool splitArray(vector<int>& nums) {
117+
int n = nums.size();
118+
vector<int> s(n + 1);
119+
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
120+
for (int j = 3; j < n - 3; ++j)
121+
{
122+
unordered_set<int> seen;
123+
for (int i = 1; i < j - 1; ++i)
124+
if (s[i] == s[j] - s[i + 1])
125+
seen.insert(s[i]);
126+
for (int k = j + 2; k < n - 1; ++k)
127+
if (s[n] - s[k + 1] == s[k] - s[j + 1] && seen.count(s[n] - s[k + 1]))
128+
return true;
129+
}
130+
return false;
131+
}
132+
};
133+
```
60134
135+
### **Go**
136+
137+
```go
138+
func splitArray(nums []int) bool {
139+
n := len(nums)
140+
s := make([]int, n+1)
141+
for i, v := range nums {
142+
s[i+1] = s[i] + v
143+
}
144+
for j := 3; j < n-3; j++ {
145+
seen := map[int]bool{}
146+
for i := 1; i < j-1; i++ {
147+
if s[i] == s[j]-s[i+1] {
148+
seen[s[i]] = true
149+
}
150+
}
151+
for k := j + 2; k < n-1; k++ {
152+
if s[n]-s[k+1] == s[k]-s[j+1] && seen[s[n]-s[k+1]] {
153+
return true
154+
}
155+
}
156+
}
157+
return false
158+
}
61159
```
62160

63161
### **...**

solution/0500-0599/0548.Split Array with Equal Sum/README_EN.md

+87-1
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,99 @@ sum(k + 1, n - 1) = sum(6, 6) = 1
6161
### **Python3**
6262

6363
```python
64-
64+
class Solution:
65+
def splitArray(self, nums: List[int]) -> bool:
66+
n = len(nums)
67+
s = [0] * (n + 1)
68+
for i, v in enumerate(nums):
69+
s[i + 1] = s[i] + v
70+
for j in range(3, n - 3):
71+
seen = set()
72+
for i in range(1, j - 1):
73+
if s[i] == s[j] - s[i + 1]:
74+
seen.add(s[i])
75+
for k in range(j + 2, n - 1):
76+
if s[n] - s[k + 1] == s[k] - s[j + 1] and s[n] - s[k + 1] in seen:
77+
return True
78+
return False
6579
```
6680

6781
### **Java**
6882

6983
```java
84+
class Solution {
85+
public boolean splitArray(int[] nums) {
86+
int n = nums.length;
87+
int[] s = new int[n + 1];
88+
for (int i = 0; i < n; ++i) {
89+
s[i + 1] = s[i] + nums[i];
90+
}
91+
for (int j = 3; j < n - 3; ++j) {
92+
Set<Integer> seen = new HashSet<>();
93+
for (int i = 1; i < j - 1; ++i) {
94+
if (s[i] == s[j] - s[i + 1]) {
95+
seen.add(s[i]);
96+
}
97+
}
98+
for (int k = j + 2; k < n - 1; ++k) {
99+
if (s[n] - s[k + 1] == s[k] - s[j + 1] && seen.contains(s[n] - s[k + 1])) {
100+
return true;
101+
}
102+
}
103+
}
104+
return false;
105+
}
106+
}
107+
```
108+
109+
### **C++**
110+
111+
```cpp
112+
class Solution {
113+
public:
114+
bool splitArray(vector<int>& nums) {
115+
int n = nums.size();
116+
vector<int> s(n + 1);
117+
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
118+
for (int j = 3; j < n - 3; ++j)
119+
{
120+
unordered_set<int> seen;
121+
for (int i = 1; i < j - 1; ++i)
122+
if (s[i] == s[j] - s[i + 1])
123+
seen.insert(s[i]);
124+
for (int k = j + 2; k < n - 1; ++k)
125+
if (s[n] - s[k + 1] == s[k] - s[j + 1] && seen.count(s[n] - s[k + 1]))
126+
return true;
127+
}
128+
return false;
129+
}
130+
};
131+
```
70132
133+
### **Go**
134+
135+
```go
136+
func splitArray(nums []int) bool {
137+
n := len(nums)
138+
s := make([]int, n+1)
139+
for i, v := range nums {
140+
s[i+1] = s[i] + v
141+
}
142+
for j := 3; j < n-3; j++ {
143+
seen := map[int]bool{}
144+
for i := 1; i < j-1; i++ {
145+
if s[i] == s[j]-s[i+1] {
146+
seen[s[i]] = true
147+
}
148+
}
149+
for k := j + 2; k < n-1; k++ {
150+
if s[n]-s[k+1] == s[k]-s[j+1] && seen[s[n]-s[k+1]] {
151+
return true
152+
}
153+
}
154+
}
155+
return false
156+
}
71157
```
72158

73159
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
bool splitArray(vector<int>& nums) {
4+
int n = nums.size();
5+
vector<int> s(n + 1);
6+
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
7+
for (int j = 3; j < n - 3; ++j)
8+
{
9+
unordered_set<int> seen;
10+
for (int i = 1; i < j - 1; ++i)
11+
if (s[i] == s[j] - s[i + 1])
12+
seen.insert(s[i]);
13+
for (int k = j + 2; k < n - 1; ++k)
14+
if (s[n] - s[k + 1] == s[k] - s[j + 1] && seen.count(s[n] - s[k + 1]))
15+
return true;
16+
}
17+
return false;
18+
}
19+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
func splitArray(nums []int) bool {
2+
n := len(nums)
3+
s := make([]int, n+1)
4+
for i, v := range nums {
5+
s[i+1] = s[i] + v
6+
}
7+
for j := 3; j < n-3; j++ {
8+
seen := map[int]bool{}
9+
for i := 1; i < j-1; i++ {
10+
if s[i] == s[j]-s[i+1] {
11+
seen[s[i]] = true
12+
}
13+
}
14+
for k := j + 2; k < n-1; k++ {
15+
if s[n]-s[k+1] == s[k]-s[j+1] && seen[s[n]-s[k+1]] {
16+
return true
17+
}
18+
}
19+
}
20+
return false
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public boolean splitArray(int[] nums) {
3+
int n = nums.length;
4+
int[] s = new int[n + 1];
5+
for (int i = 0; i < n; ++i) {
6+
s[i + 1] = s[i] + nums[i];
7+
}
8+
for (int j = 3; j < n - 3; ++j) {
9+
Set<Integer> seen = new HashSet<>();
10+
for (int i = 1; i < j - 1; ++i) {
11+
if (s[i] == s[j] - s[i + 1]) {
12+
seen.add(s[i]);
13+
}
14+
}
15+
for (int k = j + 2; k < n - 1; ++k) {
16+
if (s[n] - s[k + 1] == s[k] - s[j + 1] && seen.contains(s[n] - s[k + 1])) {
17+
return true;
18+
}
19+
}
20+
}
21+
return false;
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def splitArray(self, nums: List[int]) -> bool:
3+
n = len(nums)
4+
s = [0] * (n + 1)
5+
for i, v in enumerate(nums):
6+
s[i + 1] = s[i] + v
7+
for j in range(3, n - 3):
8+
seen = set()
9+
for i in range(1, j - 1):
10+
if s[i] == s[j] - s[i + 1]:
11+
seen.add(s[i])
12+
for k in range(j + 2, n - 1):
13+
if s[n] - s[k + 1] == s[k] - s[j + 1] and s[n] - s[k + 1] in seen:
14+
return True
15+
return False

0 commit comments

Comments
 (0)