所有奇數長度子陣列的和
阿新 • • 發佈:2021-08-29
題目連結:https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays
題目描述:
給你一個正整數陣列arr,請你計算所有可能的奇數長度子陣列的和。
子陣列 定義為原陣列中的一個連續子序列。
請你返回 arr中 所有奇數長度子陣列的和 。
題解:
方法一:暴力法
class Solution { public: int sumOddLengthSubarrays(vector<int>& arr) { int len = arr.size(); if(len == 0) return 0; int sum = 0; for(int i = 1; i <= len; i += 2) //遍歷奇數長度 { for(int j = 0; j < len - i + 1; j++) //遍歷每個長度相同的子陣列 { for(int k = 0; k < i; k++) //遍歷每個長度相同的子陣列的元素 { sum += arr[k + j]; } } } return sum; } };
方法二:字首和
class Solution { public: int sumOddLengthSubarrays(vector<int>& arr) { vector<int> prefixSum(arr.size() + 1, 0); int sum = 0; for(int i = 0; i < arr.size(); i++) //字首和陣列 { prefixSum[i + 1] = prefixSum[i] + arr[i]; } for(int start = 0; start < arr.size(); start++) //子陣列開始位置 { for(int len = 1; start + len <= arr.size(); len = len + 2) //奇數子陣列 { int end = start + len - 1; sum += prefixSum[end + 1] - prefixSum[start]; } } return sum; } };