所有奇数长度子数组的和

题目:给你一个正整数数组 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
我们将所有值求和得到 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58

示例 2:
输入:arr = [1,2]
输出:3
解释:总共只有 2 个长度为奇数的子数组,[1] 和 [2]。它们的和为 3 。

示例 3:
输入:arr = [10,11,12]
输出:66

提示:
1 <= arr.length <= 100
1 <= arr[i] <= 1000

解题思路

解法一

我们只需要枚举所有的奇数长度的子数组即可。在下面的代码中,i 用来枚举每个连续子数组的起点,gap为连续子数组的长度。accumulate用来计算起点是 i,长度为 gap 的子数组的和。时间复杂度是 O(n^3) 的。

代码展示

代码如下:

class Solution {public:int sumOddLengthSubarrays(vector<int>& arr) {int sum=0,n=arr.size();for(int i=0;i<n;i++){for(int gap=1;i+gap-1<n;gap+=2){sum+=accumulate(arr.begin()+i,arr.begin()+i+gap,0);}}return sum;}
};

解法二

就是遍历一遍所有的元素,然后查看这个元素会在多少个长度为奇数的数组中出现过。

比如题目给出的第一个测试用例 [1, 4, 2, 5, 3] 中;
1 在 3 个长度为奇数的数组中出现过:[1], [1, 4, 2], [1, 4, 2, 5, 3];所以最终的和,要加上 1 * 3;
4 在 4 个长度为奇数的数组中出现过:[4], [4, 2, 5], [1, 4, 2], [1, 4, 2, 5, 3];所以最终和,要加上 4 * 4;
2 在 5 个长度为奇数的数组中出现过:[2], [2, 5, 3], [4, 2, 5], [1, 4, 2], [1, 4, 2, 5, 3];所以最终和,要加上 5 * 2;

下面的关键就是,如何计算一个数字在多少个奇数长度的数组中出现过?
对于一个数字,它所在的数组,可以在它前面再选择 0, 1, 2, … 个数字,一共有 left = i + 1 个选择;
可以在它后面再选择 0, 1, 2, … 个数字,一共有 right = n - i 个选择。
如果在前面选择了偶数个数字,那么在后面,也必须选择偶数个数字,这样加上它自身,才构成奇数长度的数组;
如果在前面选择了奇数个数字,那么在后面,也必须选择奇数个数字,这样加上它自身,才构成奇数长度的数组;
数字前面共有 left 个选择,其中偶数个数字的选择方案有 left_even = (left + 1) / 2 个,奇数个数字的选择方案有 left_odd = left / 2 个;
数字后面共有 right 个选择,其中偶数个数字的选择方案有 right_even = (right + 1) / 2 个,奇数个数字的选择方案有 right_odd = right / 2 个;
所以,每个数字一共在 left_even * right_even + left_odd * right_odd 个奇数长度的数组中出现过。

链接:https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays/solution/cong-on3-dao-on-de-jie-fa-by-liuyubobobo/

代码展示

代码如下:

class Solution {public:int sumOddLengthSubarrays(vector<int>& arr) {int res=0;for(int i=0;i<arr.size();i++){int left=i+1,right=arr.size()-i,left_even=(left+1)/2,left_odd=left/2,right_even=(right+1)/2,right_odd=right/2;res+=(left_even*right_even+left_odd*right_odd)*arr[i];}return res;}
};

计算1~n之间所有奇数之和_所有奇数长度子数组的和相关推荐

  1. 算法 所有奇数长度子数组的和

    给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和. 子数组定义为原数组中的一个连续子序列.请你返回 arr 中 所有奇数长度子数组的和 . 示例 1: 输入:arr = [1,4,2 ...

  2. 1588. 所有奇数长度子数组的和

    1588. 所有奇数长度子数组的和 给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和. 子数组 定义为原数组中的一个连续子序列. 请你返回 arr 中 所有奇数长度子数组的和 . 示 ...

  3. 文巾解题1588. 所有奇数长度子数组的和

    1 题目描述 2 解题思路 2.1 直接求解 枚举子数组的长度和首位置 class Solution:def sumOddLengthSubarrays(self, arr: List[int]) - ...

  4. 用python计算1~100的阶乘之和_在Python中递归函数调用举例and匿名函数lambda求1~100的和及计算阶乘举例...

    1.递归列出目录里的文件的脚本举例 列出目录中的文件可以通过下面方法:os.listdir() In [1]: import os In [4]: os.listdir('/root') Out[4] ...

  5. 计算1~50之间的素数之和

    public static void main(String[] args) {int sum = 0; for (int i = 1; i <= 50; i++) {for (int j = ...

  6. python输入一个正整数、计算其各个位的数字之和_【PAT】Python 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。...

    输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10的100次方. 输出格式: 在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后 ...

  7. oracle如何判断奇数偶数_返回奇数行或者偶数行数据库表记录

    --方法1用Decode函数 for even number of records select*from emp where rowid in(select decode(mod(rownum,2) ...

  8. 2022-4-2 Leetcode 1588.所有奇数长度子数组的和

    class Solution {public:int sumOddLengthSubarrays(vector<int>& arr) {int size = arr.size(); ...

  9. python求1到n的奇数和_编写程序。输入任意整数n,计算1到n的奇数和。C语言编写程序 输入整数N 显...

    编写程序.输入任意整数n,计算1到n的奇数和. C语言编写程序 输入整数N 显 www.zhiqu.org 时间: 2020-11-23 解题思路:循环判断1到N的每一个数: 若除以2是结果为整数,也 ...

最新文章

  1. jfinal框架下使用c3P0连接池连接sql server 2008
  2. Java学习之do-while-if语句实操
  3. 偏心率e用于描述某一轨道与圆轨道的区别
  4. linux 下安装nginx
  5. linux向上翻页_linux学习基础篇——文件管理(一)
  6. 第2章 Python 数字图像处理(DIP) --数字图像基础5 -- 算术运算、集合、几何变换、傅里叶变换等
  7. 转:巧用搜狗输入法输入英文单词
  8. 合成迪丽热巴下海_热巴生图颜值回春,被韩媒吹上天,她是找了杨幂的医生?...
  9. 创业几乎不要本钱,是创业圈内最大的谎言
  10. POJ2083 ZOJ3507 Fractal题解
  11. Linux虚拟文件系统小结
  12. Ceph添加、删除osd及故障硬盘更换
  13. nicescroll.js滚动条错位
  14. 2022-2028年中国美妆工具行业市场前瞻与投资战略规划分析报告
  15. keil+stm32cubemx创建STM32F767芯片的RT-Thread工程
  16. 小米MIUI关闭内容中心通知
  17. python学习需要多长时间
  18. 戴尔服务器如何设置自动开关机,Dell服务器的IPMI/iKVM使用方法(开机,关机,重启,重装系统)...
  19. EasySearcher搜索不到EasyNVR硬件的IP地址,如何解决?
  20. 在线教育,异军突起,有一种华丽转身,叫做.NET在线讲师!(全职/兼职皆可)...

热门文章

  1. 如何使用sklearn优雅地进行数据挖掘?
  2. 机器学习算法系列(一)-基础机器学习算法入门
  3. openwrt 遍译php_openwrt安装编译
  4. php 递归到空如何处理,php递归调用删除数组空值元素的方法
  5. centos6配置mysql5.7_CentOS 6/7 下 MySQL 5.7 安装部署与配置
  6. python读取多个文件夹图片_python或C++读取指定文件夹下的所有图片
  7. 【Java从入门到天黑|03】JavaSE入门之流程控制
  8. android中屏幕宽高显示不全,Android 获取屏幕宽度跟高度
  9. python扩展文件_1. 使用 C 或 C++ 扩展 Python
  10. css实现web前端最美的loading加载动画!