【力扣算法题】奇数长度子数组的和

【力扣算法题】奇数长度子数组的和


文章目录

  • 【力扣算法题】奇数长度子数组的和
  • 题目介绍
  • 题解
  • 1. 滑动窗口/前缀和(个人解法/力扣官方解法2)
  • 2. 暴力法


题目介绍

给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。

子数组 定义为原数组中的一个连续子序列。

请你返回 arr 中 所有奇数长度子数组的和 。

示例 1:

输入:arr = [1,4,2,5,3]
输出:58
解释:所有奇数长度子数组和它们的和为:
[1] = 1
[4] = 4
[2] = 2
[5] = 5
[3] = 3
[1,4,2] = 7
[4,2,5] = 11
[2,5,3] = 10
[1,4,2,5,3] = 15

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays


题解

1. 滑动窗口/前缀和(个人解法/力扣官方解法2)

所有计数和,其实可以视为长度为1,3,5,…的滑动窗口内的元素和,之后全部加起来就是总和
滑动窗口的好处就在于,我们每次滑动,只需要将当前窗口之和减去离开窗口的元素,随后加上进入窗口的元素,这样就可以不用每次进行窗口内所有元素的遍历

(啧啧啧,明明就是滑动窗口,官方叫他前缀和那就前缀和吧)

C++源码:

int sumOddLengthSubarrays(vector<int>& arr) {
    int result = 0;
    int temp = 0;
    for(int i = 0; i < arr.size(); i += 2)
    {
        temp = 0;
        for(int j = i; j < arr.size(); j++)
        {
            if(j == i)
            {
                for(int k = 0; k <= j; k++)
                {
                    temp += arr[k];
                }
            }
            else
            {
                temp -= arr[j - i - 1];
                temp += arr[j];
            }

            result += temp;
        }
    }

    return result;
}

2. 暴力法

嗯,其实就是上面方法的劣化版,每个窗口内的元素遍历一次求和

C++源码:

int sumOddLengthSubarrays(vector<int>& arr) {
    int sum = 0;
    int n = arr.size();
    for (int start = 0; start < n; start++) {
        for (int length = 1; start + length <= n; length += 2) {
            int end = start + length - 1;
            for (int i = start; i <= end; i++) {
                sum += arr[i];
            }
        }
    }
    return sum;
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays/solution/suo-you-qi-shu-chang-du-zi-shu-zu-de-he-yoaqu/

你可能感兴趣的:(力扣算法题,c++,面试,算法)