C++中数组的accumulate求和:https://blog.csdn.net/qq_38748148/article/details/113326565
accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值。
accumulate函数将它的一个内部变量设置为指定的初始值,然后在此初值上累加输入范围内所有元素的值。accumulate算法返回累加的结果,其返回类型就是其第三个实参的类型。
如上述代码返回结果为0+1+2+3+4+5的值
原文链接:https://blog.csdn.net/qq_38748148/article/details/113326565
题解:https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays/solution/cong-on3-dao-on-de-jie-fa-by-liuyubobobo/
思路1:
题解中的i+sz-1:是子序列的末尾(相对位置,相对于begin的位置),用来控制循环,但是迭代器end指向的是尾元素的后面一个所以accumulate的范围是accumulate(arr.begin+i, arr.begin+i+sz, 0);没有问题。注意这里的第二个范围参数是begin而不是end这里和end没有任何关系。并且accumulate的终点参数(第二个参数)是尾后元素而不是尾元素。所以不用减一。[ )左闭右开区间。
只用begin来控制起点和终点。另外
两重循环:遍历所有的“元素”,对每一个元素遍历所有奇数的“长度”。
并且定义res的时候要初始化int res = 0;不然提交报错。
思路2:前缀和
.back()成员函数和.front()成员函数。primerP309
前缀和:解释https://www.cnblogs.com/-Ackerman/p/11162651.html这篇文章介绍的很好,还有有关的lc题目以及二维的解释。
二维的理解:https://blog.csdn.net/qq_41661809/article/details/86727017和
https://segmentfault.com/a/1190000022512260
求区间[i, j]的和:
sum[i, j] = b[j] - b[i-1];
类似于数学中的数列前n项和。
而且presum不是一个数而是一个数列,是数列前n项和所组成的数列。
所以presum.back()和数组元素相加之后得到的结果要push_back()到presum数组中去。
res += presum[i+sz] - presum[i];
这句话的理解。先记住。由数组得到前缀和数组,利用前缀和数组求数组的某区间和。
思路3:如何计算一个数字在多少个奇数长度的数组中出现过?
https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays/solution/kan-guo-bie-ren-onjie-fa-hou-de-bi-ji-by-gx27/
解释的比较细。
https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays/solution/cong-on3-dao-on-de-jie-fa-by-liuyubobobo/
原文:https://www.cnblogs.com/zlh-1024powr/p/14517165.html