首页 > 其他 > 详细

LC1588

时间:2021-03-11 17:23:27      阅读:13      评论:0      收藏:0      [点我收藏+]

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 += accumulate(arr.begin() + i, arr.begin() + i + sz, 0);
需要将每次的求和结果都累加到res中,不然只有最后一次的结果保留在了res中。

两重循环:遍历所有的“元素”,对每一个元素遍历所有奇数的“长度”。

并且定义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/

LC1588

原文:https://www.cnblogs.com/zlh-1024powr/p/14517165.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!