Skip to content

Commit f690dad

Browse files
authored
feat: add solutions to lc problem: No.1712 (doocs#807)
No.1712.Ways to Split Array Into Three Subarrays
1 parent f385924 commit f690dad

File tree

4 files changed

+195
-4
lines changed

4 files changed

+195
-4
lines changed

solution/1700-1799/1712.Ways to Split Array Into Three Subarrays/README.md

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,78 @@
6262
<!-- 这里可写当前语言的特殊实现逻辑 -->
6363

6464
```python
65-
65+
class Solution:
66+
def waysToSplit(self, nums: List[int]) -> int:
67+
mod = 1e9 + 7
68+
n = len(nums)
69+
pre = [0] * (n + 1)
70+
for i in range(1, n + 1):
71+
pre[i] = pre[i - 1] + nums[i - 1]
72+
ans = 0
73+
for i in range(1, n - 1):
74+
if pre[i] * 3 > pre[n]:
75+
break
76+
left, right = i + 1, n - 1
77+
while left < right:
78+
mid = (left + right + 1) >> 1
79+
if pre[mid] - pre[i] <= pre[n] - pre[mid]:
80+
left = mid
81+
else:
82+
right = mid - 1
83+
mid_right = left
84+
left, right = i + 1, n - 1
85+
while left < right:
86+
mid = (left + right) >> 1
87+
if pre[mid] - pre[i] >= pre[i]:
88+
right = mid
89+
else:
90+
left = mid + 1
91+
ans += (mid_right - left + 1) % mod
92+
return int(ans % mod)
6693
```
6794

6895
### **Java**
6996

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

7299
```java
73-
100+
class Solution {
101+
public int waysToSplit(int[] nums) {
102+
double mod = 1e9 + 7;
103+
int n = nums.length;
104+
long[] pre = new long[n + 1];
105+
for (int i = 1; i < n + 1; i++) {
106+
pre[i] = pre[i - 1] + nums[i - 1];
107+
}
108+
double ans = 0;
109+
for (int i = 1; i < n - 1; i++) {
110+
if (pre[i] * 3 > pre[n]) {
111+
break;
112+
}
113+
int left = i + 1, right = n - 1;
114+
while (left < right) {
115+
int mid = (left + right + 1) >> 1;
116+
if (pre[mid] - pre[i] <= pre[n] - pre[mid]) {
117+
left = mid;
118+
} else {
119+
right = mid - 1;
120+
}
121+
}
122+
int midRight = left;
123+
left = i + 1; right = n - 1;
124+
while (left < right) {
125+
int mid = (left + right) >> 1;
126+
if (pre[mid] - pre[i] >= pre[i]) {
127+
right = mid;
128+
} else {
129+
left = mid + 1;
130+
}
131+
}
132+
ans += (midRight - left + 1) % mod;
133+
}
134+
return (int) (ans % mod);
135+
}
136+
}
74137
```
75138

76139
### **...**

solution/1700-1799/1712.Ways to Split Array Into Three Subarrays/README_EN.md

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,76 @@
7171
### **Python3**
7272

7373
```python
74-
74+
class Solution:
75+
def waysToSplit(self, nums: List[int]) -> int:
76+
mod = 1e9 + 7
77+
n = len(nums)
78+
pre = [0] * (n + 1)
79+
for i in range(1, n + 1):
80+
pre[i] = pre[i - 1] + nums[i - 1]
81+
ans = 0
82+
for i in range(1, n - 1):
83+
if pre[i] * 3 > pre[n]:
84+
break
85+
left, right = i + 1, n - 1
86+
while left < right:
87+
mid = (left + right + 1) >> 1
88+
if pre[mid] - pre[i] <= pre[n] - pre[mid]:
89+
left = mid
90+
else:
91+
right = mid - 1
92+
mid_right = left
93+
left, right = i + 1, n - 1
94+
while left < right:
95+
mid = (left + right) >> 1
96+
if pre[mid] - pre[i] >= pre[i]:
97+
right = mid
98+
else:
99+
left = mid + 1
100+
ans += (mid_right - left + 1) % mod
101+
return int(ans % mod)
75102
```
76103

77104
### **Java**
78105

79106
```java
80-
107+
class Solution {
108+
public int waysToSplit(int[] nums) {
109+
double mod = 1e9 + 7;
110+
int n = nums.length;
111+
long[] pre = new long[n + 1];
112+
for (int i = 1; i < n + 1; i++) {
113+
pre[i] = pre[i - 1] + nums[i - 1];
114+
}
115+
double ans = 0;
116+
for (int i = 1; i < n - 1; i++) {
117+
if (pre[i] * 3 > pre[n]) {
118+
break;
119+
}
120+
int left = i + 1, right = n - 1;
121+
while (left < right) {
122+
int mid = (left + right + 1) >> 1;
123+
if (pre[mid] - pre[i] <= pre[n] - pre[mid]) {
124+
left = mid;
125+
} else {
126+
right = mid - 1;
127+
}
128+
}
129+
int midRight = left;
130+
left = i + 1; right = n - 1;
131+
while (left < right) {
132+
int mid = (left + right) >> 1;
133+
if (pre[mid] - pre[i] >= pre[i]) {
134+
right = mid;
135+
} else {
136+
left = mid + 1;
137+
}
138+
}
139+
ans += (midRight - left + 1) % mod;
140+
}
141+
return (int) (ans % mod);
142+
}
143+
}
81144
```
82145

83146
### **...**
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
class Solution {
2+
public int waysToSplit(int[] nums) {
3+
double mod = 1e9 + 7;
4+
int n = nums.length;
5+
long[] pre = new long[n + 1];
6+
for (int i = 1; i < n + 1; i++) {
7+
pre[i] = pre[i - 1] + nums[i - 1];
8+
}
9+
double ans = 0;
10+
for (int i = 1; i < n - 1; i++) {
11+
if (pre[i] * 3 > pre[n]) {
12+
break;
13+
}
14+
int left = i + 1, right = n - 1;
15+
while (left < right) {
16+
int mid = (left + right + 1) >> 1;
17+
if (pre[mid] - pre[i] <= pre[n] - pre[mid]) {
18+
left = mid;
19+
} else {
20+
right = mid - 1;
21+
}
22+
}
23+
int midRight = left;
24+
left = i + 1; right = n - 1;
25+
while (left < right) {
26+
int mid = (left + right) >> 1;
27+
if (pre[mid] - pre[i] >= pre[i]) {
28+
right = mid;
29+
} else {
30+
left = mid + 1;
31+
}
32+
}
33+
ans += (midRight - left + 1) % mod;
34+
}
35+
return (int) (ans % mod);
36+
}
37+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution:
2+
def waysToSplit(self, nums: List[int]) -> int:
3+
mod = 1e9 + 7
4+
n = len(nums)
5+
pre = [0] * (n + 1)
6+
for i in range(1, n + 1):
7+
pre[i] = pre[i - 1] + nums[i - 1]
8+
ans = 0
9+
for i in range(1, n - 1):
10+
if pre[i] * 3 > pre[n]:
11+
break
12+
left, right = i + 1, n - 1
13+
while left < right:
14+
mid = (left + right + 1) >> 1
15+
if pre[mid] - pre[i] <= pre[n] - pre[mid]:
16+
left = mid
17+
else:
18+
right = mid - 1
19+
mid_right = left
20+
left, right = i + 1, n - 1
21+
while left < right:
22+
mid = (left + right) >> 1
23+
if pre[mid] - pre[i] >= pre[i]:
24+
right = mid
25+
else:
26+
left = mid + 1
27+
ans += (mid_right - left + 1) % mod
28+
return int(ans % mod)

0 commit comments

Comments
 (0)