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

题目描述


思路

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

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

接着,我们计算需要返回的ret。我们定义两个循环变量i和j。先定i不动,j向后移动,然后每移动一个位置,就判断一下,是否i和j之间相差奇数个数,若是,则ret+=sum[j]-sum[i-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;
        }
};
相关推荐
itsuifengerxing7 分钟前
python 自定义无符号右移
算法
猎板PCB厚铜专家大族37 分钟前
高频 PCB 技术发展趋势与应用解析
人工智能·算法·设计规范
dying_man1 小时前
LeetCode--24.两两交换链表中的结点
算法·leetcode
yours_Gabriel1 小时前
【力扣】2434.使用机器人打印字典序最小的字符串
算法·leetcode·贪心算法
草莓熊Lotso2 小时前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM2 小时前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
CV点灯大师2 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl2 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康2 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting
武子康2 小时前
大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现
大数据·人工智能·算法·机器学习·ai·spark-ml·boosting