【Leetcode】1588.所有奇数长度子数组的和

题目描述


思路

题目要求我们求解所有奇数长度数组的和。若暴力循环求解,时间复杂度过高。所以,我们可以采用前缀和优化。

如上图输入arr数组,sumi用于计算arr数组中前i个数的和。(在程序中,先给sum0赋值,等于arr0,其余sumi=sumi-1+arri)

接着,我们计算需要返回的ret。我们定义两个循环变量i和j。先定i不动,j向后移动,然后每移动一个位置,就判断一下,是否i和j之间相差奇数个数,若是,则ret+=sumj-sumi-1。(包括i,所以是减去前一个位置的。)

然后i作为外层循环,后续循环如上面一样判断。

代码

cpp 复制代码
class Solution {
public:
        int sumOddLengthSubarrays(vector<int>&arr) {
        
        int length=arr.size();//获取数组中元素的个数
        int sum[length];//定义前缀和数组
        long long int ret;
        ret=0;
        sum[0]=arr[0];
        //计算前缀和
        for (int i=1;i<length;i++)
        {
            sum[i]=sum[i-1]+arr[i];
        }
        
        for (int  i=0;i<length;i++)
        {
            for (int j=i;j<length;j++)
            {
                
            if ((j-i+1)%2)//若相差奇数个数
            {
            if (i==0) ret+=sum[j];//i=0时,不分开讨论sum[i-1]数组越界。
            else
                ret+=sum[j]-sum[i-1];
            }
            
            }
        }
        return ret;
        }
};
相关推荐
Tisfy1 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-1 小时前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。1 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论
专注仿真2 小时前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
zlinear数据采集卡3 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
GeekZHR4 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
Herbert_hwt4 小时前
第七章 Java深入理解枚举类型
java·开发语言·算法
.道阻且长.4 小时前
8.LeetCode算法习题讲解--滑动窗口--长度最小的子数组
算法·leetcode·职场和发展
(❁´◡`❁)Jimmy(❁´◡`❁)4 小时前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
疯狂打码的少年5 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法