1. 程式人生 > 其它 >所有奇數長度子陣列的和

所有奇數長度子陣列的和

題目連結: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;            
    }                         
};