@@ -42,22 +42,120 @@ sum(k + 1, n - 1) = sum(6, 6) = 1
42
42
43
43
<!-- 这里可写通用的实现逻辑 -->
44
44
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
+
45
57
<!-- tabs:start -->
46
58
47
59
### ** Python3**
48
60
49
61
<!-- 这里可写当前语言的特殊实现逻辑 -->
50
62
51
63
``` 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
53
79
```
54
80
55
81
### ** Java**
56
82
57
83
<!-- 这里可写当前语言的特殊实现逻辑 -->
58
84
59
85
``` 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
+ ```
60
134
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
+ }
61
159
```
62
160
63
161
### ** ...**
0 commit comments