Skip to content

Commit 7474af4

Browse files
committed
feat: add solutions to lc problem: No.1588
No.1588.Sum of All Odd Length Subarrays
1 parent fa419d6 commit 7474af4

File tree

9 files changed

+175
-183
lines changed

9 files changed

+175
-183
lines changed

solution/1500-1599/1588.Sum of All Odd Length Subarrays/README.md

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@
6464

6565
<!-- 这里可写通用的实现逻辑 -->
6666

67-
“前缀和”实现。
67+
**方法一:枚举 + 前缀和**
68+
69+
我们可以枚举子数组的起点 $i$ 和终点 $j$,其中 $i \leq j$,维护每个子数组的和,然后判断子数组的长度是否为奇数,如果是,则将子数组的和加入答案。
70+
71+
时间复杂度 $O(n^2)$,空间复杂度 $O(1)$。其中 $n$ 是数组的长度。
6872

6973
<!-- tabs:start -->
7074

@@ -75,17 +79,14 @@
7579
```python
7680
class Solution:
7781
def sumOddLengthSubarrays(self, arr: List[int]) -> int:
78-
n = len(arr)
79-
presum = [0] * (n + 1)
80-
for i in range(n):
81-
presum[i + 1] = presum[i] + arr[i]
82-
83-
res = 0
82+
ans, n = 0, len(arr)
8483
for i in range(n):
85-
for j in range(0, n, 2):
86-
if i + j < n:
87-
res += presum[i + j + 1] - presum[i]
88-
return res
84+
s = 0
85+
for j in range(i, n):
86+
s += arr[j]
87+
if (j - i + 1) & 1:
88+
ans += s
89+
return ans
8990
```
9091

9192
### **Java**
@@ -96,17 +97,17 @@ class Solution:
9697
class Solution {
9798
public int sumOddLengthSubarrays(int[] arr) {
9899
int n = arr.length;
99-
int[] presum = new int[n + 1];
100-
for (int i = 0; i < n; ++i) {
101-
presum[i + 1] = presum[i] + arr[i];
102-
}
103-
int res = 0;
100+
int ans = 0;
104101
for (int i = 0; i < n; ++i) {
105-
for (int j = 0; i + j < n; j += 2) {
106-
res += presum[i + j + 1] - presum[i];
102+
int s = 0;
103+
for (int j = i; j < n; ++j) {
104+
s += arr[j];
105+
if ((j - i + 1) % 2 == 1) {
106+
ans += s;
107+
}
107108
}
108109
}
109-
return res;
110+
return ans;
110111
}
111112
}
112113
```
@@ -118,35 +119,36 @@ class Solution {
118119
public:
119120
int sumOddLengthSubarrays(vector<int>& arr) {
120121
int n = arr.size();
121-
int presum[n + 1];
122-
for (int i = 0; i < n; ++i) presum[i + 1] = presum[i] + arr[i];
123-
int res = 0;
122+
int ans = 0;
124123
for (int i = 0; i < n; ++i) {
125-
for (int j = 0; i + j < n; j += 2) {
126-
res += presum[i + j + 1] - presum[i];
124+
int s = 0;
125+
for (int j = i; j < n; ++j) {
126+
s += arr[j];
127+
if ((j - i + 1) & 1) {
128+
ans += s;
129+
}
127130
}
128131
}
129-
return res;
132+
return ans;
130133
}
131134
};
132135
```
133136
134137
### **Go**
135138
136139
```go
137-
func sumOddLengthSubarrays(arr []int) int {
140+
func sumOddLengthSubarrays(arr []int) (ans int) {
138141
n := len(arr)
139-
presum := make([]int, n+1)
140142
for i := range arr {
141-
presum[i+1] = presum[i] + arr[i]
142-
}
143-
res := 0
144-
for i := 0; i < n; i++ {
145-
for j := 0; i+j < n; j += 2 {
146-
res += presum[i+j+1] - presum[i]
143+
s := 0
144+
for j := i; j < n; j++ {
145+
s += arr[j]
146+
if (j-i+1)%2 == 1 {
147+
ans += s
148+
}
147149
}
148150
}
149-
return res
151+
return
150152
}
151153
```
152154

@@ -155,16 +157,17 @@ func sumOddLengthSubarrays(arr []int) int {
155157
```ts
156158
function sumOddLengthSubarrays(arr: number[]): number {
157159
const n = arr.length;
158-
let res = 0;
159-
for (let i = 1; i <= n; i += 2) {
160-
let sum = arr.slice(0, i).reduce((r, v) => r + v);
161-
res += sum;
162-
for (let j = i; j < n; j++) {
163-
sum += arr[j] - arr[j - i];
164-
res += sum;
160+
let ans = 0;
161+
for (let i = 0; i < n; ++i) {
162+
let s = 0;
163+
for (let j = i; j < n; ++j) {
164+
s += arr[j];
165+
if ((j - i + 1) % 2 === 1) {
166+
ans += s;
167+
}
165168
}
166169
}
167-
return res;
170+
return ans;
168171
}
169172
```
170173

@@ -174,36 +177,33 @@ function sumOddLengthSubarrays(arr: number[]): number {
174177
impl Solution {
175178
pub fn sum_odd_length_subarrays(arr: Vec<i32>) -> i32 {
176179
let n = arr.len();
177-
let mut res = 0;
178-
let mut i = 1;
179-
while i <= n {
180-
let mut sum: i32 = arr[0..i].iter().sum();
181-
res += sum;
180+
let mut ans = 0;
181+
for i in 0..n {
182+
let mut s = 0;
182183
for j in i..n {
183-
sum += arr[j] - arr[j - i];
184-
res += sum;
184+
s += arr[j];
185+
if (j - i + 1) % 2 == 1 {
186+
ans += s;
187+
}
185188
}
186-
i += 2;
187189
}
188-
res
190+
ans
189191
}
190192
}
191193
```
192194

193195
### **C**
194196

195197
```c
196-
int sumOddLengthSubarrays(int *arr, int arrSize) {
198+
int sumOddLengthSubarrays(int* arr, int arrSize){
197199
int ans = 0;
198-
for (int i = 1; i <= arrSize; i += 2) {
199-
int sum = 0;
200-
for (int j = 0; j < i; j++) {
201-
sum += arr[j];
202-
}
203-
ans += sum;
204-
for (int j = i; j < arrSize; j++) {
205-
sum += arr[j] - arr[j - i];
206-
ans += sum;
200+
for (int i = 0; i < arrSize; ++i) {
201+
int s = 0;
202+
for (int j = i; j < arrSize; ++j) {
203+
s += arr[j];
204+
if ((j - i + 1) % 2 == 1) {
205+
ans += s;
206+
}
207207
}
208208
}
209209
return ans;

solution/1500-1599/1588.Sum of All Odd Length Subarrays/README_EN.md

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,14 @@ If we add all these together we get 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58</p
6262
```python
6363
class Solution:
6464
def sumOddLengthSubarrays(self, arr: List[int]) -> int:
65-
n = len(arr)
66-
presum = [0] * (n + 1)
65+
ans, n = 0, len(arr)
6766
for i in range(n):
68-
presum[i + 1] = presum[i] + arr[i]
69-
70-
res = 0
71-
for i in range(n):
72-
for j in range(0, n, 2):
73-
if i + j < n:
74-
res += presum[i + j + 1] - presum[i]
75-
return res
67+
s = 0
68+
for j in range(i, n):
69+
s += arr[j]
70+
if (j - i + 1) & 1:
71+
ans += s
72+
return ans
7673
```
7774

7875
### **Java**
@@ -81,17 +78,17 @@ class Solution:
8178
class Solution {
8279
public int sumOddLengthSubarrays(int[] arr) {
8380
int n = arr.length;
84-
int[] presum = new int[n + 1];
81+
int ans = 0;
8582
for (int i = 0; i < n; ++i) {
86-
presum[i + 1] = presum[i] + arr[i];
87-
}
88-
int res = 0;
89-
for (int i = 0; i < n; ++i) {
90-
for (int j = 0; i + j < n; j += 2) {
91-
res += presum[i + j + 1] - presum[i];
83+
int s = 0;
84+
for (int j = i; j < n; ++j) {
85+
s += arr[j];
86+
if ((j - i + 1) % 2 == 1) {
87+
ans += s;
88+
}
9289
}
9390
}
94-
return res;
91+
return ans;
9592
}
9693
}
9794
```
@@ -103,35 +100,36 @@ class Solution {
103100
public:
104101
int sumOddLengthSubarrays(vector<int>& arr) {
105102
int n = arr.size();
106-
int presum[n + 1];
107-
for (int i = 0; i < n; ++i) presum[i + 1] = presum[i] + arr[i];
108-
int res = 0;
103+
int ans = 0;
109104
for (int i = 0; i < n; ++i) {
110-
for (int j = 0; i + j < n; j += 2) {
111-
res += presum[i + j + 1] - presum[i];
105+
int s = 0;
106+
for (int j = i; j < n; ++j) {
107+
s += arr[j];
108+
if ((j - i + 1) & 1) {
109+
ans += s;
110+
}
112111
}
113112
}
114-
return res;
113+
return ans;
115114
}
116115
};
117116
```
118117
119118
### **Go**
120119
121120
```go
122-
func sumOddLengthSubarrays(arr []int) int {
121+
func sumOddLengthSubarrays(arr []int) (ans int) {
123122
n := len(arr)
124-
presum := make([]int, n+1)
125123
for i := range arr {
126-
presum[i+1] = presum[i] + arr[i]
127-
}
128-
res := 0
129-
for i := 0; i < n; i++ {
130-
for j := 0; i+j < n; j += 2 {
131-
res += presum[i+j+1] - presum[i]
124+
s := 0
125+
for j := i; j < n; j++ {
126+
s += arr[j]
127+
if (j-i+1)%2 == 1 {
128+
ans += s
129+
}
132130
}
133131
}
134-
return res
132+
return
135133
}
136134
```
137135

@@ -140,16 +138,17 @@ func sumOddLengthSubarrays(arr []int) int {
140138
```ts
141139
function sumOddLengthSubarrays(arr: number[]): number {
142140
const n = arr.length;
143-
let res = 0;
144-
for (let i = 1; i <= n; i += 2) {
145-
let sum = arr.slice(0, i).reduce((r, v) => r + v);
146-
res += sum;
147-
for (let j = i; j < n; j++) {
148-
sum += arr[j] - arr[j - i];
149-
res += sum;
141+
let ans = 0;
142+
for (let i = 0; i < n; ++i) {
143+
let s = 0;
144+
for (let j = i; j < n; ++j) {
145+
s += arr[j];
146+
if ((j - i + 1) % 2 === 1) {
147+
ans += s;
148+
}
150149
}
151150
}
152-
return res;
151+
return ans;
153152
}
154153
```
155154

@@ -159,36 +158,33 @@ function sumOddLengthSubarrays(arr: number[]): number {
159158
impl Solution {
160159
pub fn sum_odd_length_subarrays(arr: Vec<i32>) -> i32 {
161160
let n = arr.len();
162-
let mut res = 0;
163-
let mut i = 1;
164-
while i <= n {
165-
let mut sum: i32 = arr[0..i].iter().sum();
166-
res += sum;
161+
let mut ans = 0;
162+
for i in 0..n {
163+
let mut s = 0;
167164
for j in i..n {
168-
sum += arr[j] - arr[j - i];
169-
res += sum;
165+
s += arr[j];
166+
if (j - i + 1) % 2 == 1 {
167+
ans += s;
168+
}
170169
}
171-
i += 2;
172170
}
173-
res
171+
ans
174172
}
175173
}
176174
```
177175

178176
### **C**
179177

180178
```c
181-
int sumOddLengthSubarrays(int *arr, int arrSize) {
179+
int sumOddLengthSubarrays(int* arr, int arrSize){
182180
int ans = 0;
183-
for (int i = 1; i <= arrSize; i += 2) {
184-
int sum = 0;
185-
for (int j = 0; j < i; j++) {
186-
sum += arr[j];
187-
}
188-
ans += sum;
189-
for (int j = i; j < arrSize; j++) {
190-
sum += arr[j] - arr[j - i];
191-
ans += sum;
181+
for (int i = 0; i < arrSize; ++i) {
182+
int s = 0;
183+
for (int j = i; j < arrSize; ++j) {
184+
s += arr[j];
185+
if ((j - i + 1) % 2 == 1) {
186+
ans += s;
187+
}
192188
}
193189
}
194190
return ans;

0 commit comments

Comments
 (0)