Skip to content

Commit fcff186

Browse files
committed
feat: add solutions to lc problem: No.2607
No.2607.Make K-Subarray Sums Equal
1 parent 1f6547d commit fcff186

File tree

14 files changed

+64
-70
lines changed

14 files changed

+64
-70
lines changed

solution/1000-1099/1039.Minimum Score Triangulation of Polygon/Solution.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ def minScoreTriangulation(self, values: List[int]) -> int:
44
def dfs(i: int, j: int) -> int:
55
if i + 1 == j:
66
return 0
7-
return min(dfs(i, k) + dfs(k, j) + values[i] * values[k] * values[j] for k in range(i + 1, j))
7+
return min(
8+
dfs(i, k) + dfs(k, j) + values[i] * values[k] * values[j]
9+
for k in range(i + 1, j)
10+
)
811

912
return dfs(0, len(values) - 1)

solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ def maxWidthOfVerticalArea(self, points: List[List[int]]) -> int:
1717
continue
1818
ans = max(ans, curmin - prev)
1919
prev = curmax
20-
return ans
20+
return ans

solution/1600-1699/1644.Lowest Common Ancestor of a Binary Tree II/Solution.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
# self.left = None
66
# self.right = None
77

8+
89
class Solution:
9-
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
10+
def lowestCommonAncestor(
11+
self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode'
12+
) -> 'TreeNode':
1013
def dfs(root, p, q):
1114
if root is None:
1215
return False

solution/1800-1899/1868.Product of Two Run-Length Encoded Arrays/Solution.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
class Solution:
2-
def findRLEArray(self, encoded1: List[List[int]], encoded2: List[List[int]]) -> List[List[int]]:
2+
def findRLEArray(
3+
self, encoded1: List[List[int]], encoded2: List[List[int]]
4+
) -> List[List[int]]:
35
ans = []
46
j = 0
57
for vi, fi in encoded1:

solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ def maxSum(self, grid: List[List[int]]) -> int:
55
for i in range(1, m - 1):
66
for j in range(1, n - 1):
77
s = -grid[i][j - 1] - grid[i][j + 1]
8-
s += sum(grid[x][y] for x in range(i - 1, i + 2)
9-
for y in range(j - 1, j + 2))
8+
s += sum(
9+
grid[x][y] for x in range(i - 1, i + 2) for y in range(j - 1, j + 2)
10+
)
1011
ans = max(ans, s)
1112
return ans

solution/2600-2699/2600.K Items With the Maximum Sum/Solution.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
class Solution:
2-
def kItemsWithMaximumSum(self, numOnes: int, numZeros: int, numNegOnes: int, k: int) -> int:
2+
def kItemsWithMaximumSum(
3+
self, numOnes: int, numZeros: int, numNegOnes: int, k: int
4+
) -> int:
35
if numOnes >= k:
46
return k
57
k -= numOnes

solution/2600-2699/2607.Make K-Subarray Sums Equal/README.md

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,36 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
**方法一:数学(裴蜀定理) + 中位数贪心**
61+
62+
题目要求每个长度为 $k$ 的子数组的元素总和相等,那么有以下等式成立:
63+
64+
$$
65+
arr_i + arr_{i + 1} + \cdots + arr_{i + k - 1} = arr_{i + 1} + arr_{i + 2} + \cdots + arr_{i + k}
66+
$$
67+
68+
化简得:
69+
70+
$$
71+
arr_i = arr_{i + k}
72+
$$
73+
74+
也即是说,数组 $arr$ 有一个大小为 $k$ 的循环节,而由于数组 $arr$ 是一个循环数组,那么数组 $arr$ 也有一个长度为 $n$ 的循环节。换句话说,数组 $arr$ 上间隔为 $k$,以及间隔为 $n$ 的元素均相等。即有:
75+
76+
$$
77+
arr_i = arr_{i + k \times x + n \times y}
78+
$$
79+
80+
根据裴蜀定理,有 $a \times x + b \times y = gcd(a, b)$,因此,有:
81+
82+
$$
83+
arr_i = arr_{i + k \times x + n \times y} = arr_{i + gcd(k, n)}
84+
$$
85+
86+
因此,数组 $arr$ 上的元素可以分为 $gcd(k, n)$ 组,每组的元素间隔为 $gcd(k, n)$,且每一组中的所有元素均相等。对于每一组,我们可以将其元素按照大小排序,然后取中位数,即可将该组中的所有元素变为中位数。对于所有组,我们将其中位数之差的绝对值求和,即为答案。
87+
88+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $arr$ 的长度。
89+
6090
<!-- tabs:start -->
6191

6292
### **Python3**
@@ -67,15 +97,12 @@
6797
class Solution:
6898
def makeSubKSumEqual(self, arr: List[int], k: int) -> int:
6999
n = len(arr)
70-
if n == k:
71-
return 0
72100
g = gcd(n, k)
73101
ans = 0
74102
for i in range(g):
75-
t = sorted(arr[j] for j in range(i, n, g))
103+
t = sorted(arr[i:n:g])
76104
mid = t[len(t) >> 1]
77-
s = sum(abs(x - mid) for x in t)
78-
ans += s
105+
ans += sum(abs(x - mid) for x in t)
79106
return ans
80107
```
81108

@@ -87,9 +114,6 @@ class Solution:
87114
class Solution {
88115
public long makeSubKSumEqual(int[] arr, int k) {
89116
int n = arr.length;
90-
if (n == k) {
91-
return 0;
92-
}
93117
int g = gcd(n, k);
94118
long ans = 0;
95119
for (int i = 0; i < g; ++i) {
@@ -99,11 +123,9 @@ class Solution {
99123
}
100124
t.sort((a, b) -> a - b);
101125
int mid = t.get(t.size() >> 1);
102-
long s = 0;
103126
for (int x : t) {
104-
s += Math.abs(x - mid);
127+
ans += Math.abs(x - mid);
105128
}
106-
ans += s;
107129
}
108130
return ans;
109131
}
@@ -121,9 +143,6 @@ class Solution {
121143
public:
122144
long long makeSubKSumEqual(vector<int>& arr, int k) {
123145
int n = arr.size();
124-
if (n == k) {
125-
return 0;
126-
}
127146
int g = gcd(n, k);
128147
long long ans = 0;
129148
for (int i = 0; i < g; ++i) {
@@ -133,11 +152,9 @@ public:
133152
}
134153
sort(t.begin(), t.end());
135154
int mid = t[t.size() / 2];
136-
long long s = 0;
137155
for (int x : t) {
138-
s += abs(x - mid);
156+
ans += abs(x - mid);
139157
}
140-
ans += s;
141158
}
142159
return ans;
143160
}
@@ -149,9 +166,6 @@ public:
149166
```go
150167
func makeSubKSumEqual(arr []int, k int) (ans int64) {
151168
n := len(arr)
152-
if n == k {
153-
return 0
154-
}
155169
g := gcd(n, k)
156170
for i := 0; i < g; i++ {
157171
t := []int{}

solution/2600-2699/2607.Make K-Subarray Sums Equal/README_EN.md

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,12 @@ The array after the operations is [5,5,5,5]
6161
class Solution:
6262
def makeSubKSumEqual(self, arr: List[int], k: int) -> int:
6363
n = len(arr)
64-
if n == k:
65-
return 0
6664
g = gcd(n, k)
6765
ans = 0
6866
for i in range(g):
69-
t = sorted(arr[j] for j in range(i, n, g))
67+
t = sorted(arr[i:n:g])
7068
mid = t[len(t) >> 1]
71-
s = sum(abs(x - mid) for x in t)
72-
ans += s
69+
ans += sum(abs(x - mid) for x in t)
7370
return ans
7471
```
7572

@@ -79,9 +76,6 @@ class Solution:
7976
class Solution {
8077
public long makeSubKSumEqual(int[] arr, int k) {
8178
int n = arr.length;
82-
if (n == k) {
83-
return 0;
84-
}
8579
int g = gcd(n, k);
8680
long ans = 0;
8781
for (int i = 0; i < g; ++i) {
@@ -91,11 +85,9 @@ class Solution {
9185
}
9286
t.sort((a, b) -> a - b);
9387
int mid = t.get(t.size() >> 1);
94-
long s = 0;
9588
for (int x : t) {
96-
s += Math.abs(x - mid);
89+
ans += Math.abs(x - mid);
9790
}
98-
ans += s;
9991
}
10092
return ans;
10193
}
@@ -113,9 +105,6 @@ class Solution {
113105
public:
114106
long long makeSubKSumEqual(vector<int>& arr, int k) {
115107
int n = arr.size();
116-
if (n == k) {
117-
return 0;
118-
}
119108
int g = gcd(n, k);
120109
long long ans = 0;
121110
for (int i = 0; i < g; ++i) {
@@ -125,11 +114,9 @@ public:
125114
}
126115
sort(t.begin(), t.end());
127116
int mid = t[t.size() / 2];
128-
long long s = 0;
129117
for (int x : t) {
130-
s += abs(x - mid);
118+
ans += abs(x - mid);
131119
}
132-
ans += s;
133120
}
134121
return ans;
135122
}
@@ -141,9 +128,6 @@ public:
141128
```go
142129
func makeSubKSumEqual(arr []int, k int) (ans int64) {
143130
n := len(arr)
144-
if n == k {
145-
return 0
146-
}
147131
g := gcd(n, k)
148132
for i := 0; i < g; i++ {
149133
t := []int{}

solution/2600-2699/2607.Make K-Subarray Sums Equal/Solution.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ class Solution {
22
public:
33
long long makeSubKSumEqual(vector<int>& arr, int k) {
44
int n = arr.size();
5-
if (n == k) {
6-
return 0;
7-
}
85
int g = gcd(n, k);
96
long long ans = 0;
107
for (int i = 0; i < g; ++i) {
@@ -14,11 +11,9 @@ class Solution {
1411
}
1512
sort(t.begin(), t.end());
1613
int mid = t[t.size() / 2];
17-
long long s = 0;
1814
for (int x : t) {
19-
s += abs(x - mid);
15+
ans += abs(x - mid);
2016
}
21-
ans += s;
2217
}
2318
return ans;
2419
}

solution/2600-2699/2607.Make K-Subarray Sums Equal/Solution.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
func makeSubKSumEqual(arr []int, k int) (ans int64) {
22
n := len(arr)
3-
if n == k {
4-
return 0
5-
}
63
g := gcd(n, k)
74
for i := 0; i < g; i++ {
85
t := []int{}

0 commit comments

Comments
 (0)