原题链接
一道简单题的套路性解法,找各个元素出现次数的规律。
思路:
- 要求子数组的长度为奇数,如果以当前元素 arr[i] 为中心,那么只有两种情况:
__左右两边均为奇数个元素
__左右两边均为偶数个元素 - 找出对应情况的数,相乘即为该元素在最终求和里面出现的次数。
代码:
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
if(arr.empty()) return 0;
int sum = 0;
int len = arr.size();
for(int i = 0; i < len; i++){
int LO = (i + 1)/2, LE = i/2 + 1;
int RO = (len - i)/2, RE = (len - 1 - i)/2 + 1;
sum += arr[i]*(LO*RO + LE*RE);
}
return sum;
}
};
当然有暴力解法:
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
if(arr.empty()) return 0;
int sum = 0;
for(int i = 1; i <= arr.size(); i += 2){
int j = 0;
while(j + i <= arr.size()){
for(int k = j; k < j + i; k++) sum += arr[k];
j++;
}
}
return sum;
}
};
两种情况效率对比图:(下面为暴力解法)
是O(n^3)与O(n)的时间效率比。