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

Given an array of positive integers arr(正整数), calculate(计算) the sum of all possible odd-length subarrays.(奇数长度子数组的和)

A subarray(n. 子阵列;子数组) is a contiguous(连续的) subsequence(n. 随后;接着(尤指结果、效果);(数学)子序列,部分序列) of the array.

Return the sum of all odd-length subarrays of arr.(返回arr的所有奇数长度子数组的和。)

Example 1:
Input: arr = [1,4,2,5,3]
Output: 58
Explanation: The odd-length subarrays of arr and their sums are:
[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
If we add all these together we get 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58

Example 2:
Input: arr = [1,2]
Output: 3
Explanation: There are only 2 subarrays of odd length, [1] and [2]. Their sum is 3.

Example 3:
Input: arr = [10,11,12]
Output: 66

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

第一方法:计算每个元素会出现的次数然后合起来*这个数的值累积=总值

(从leedcode的题解看到的一种方法)

class Solution {public int sumOddLengthSubarrays(int[] arr) {int res = 0;int arrSize=arr.length;int lEven,lOdd,rEven,rOdd;
//1 2 3 4 5
//lodd=(0+1)/2=0
//levrn=1;
//rodd=5/2=2;
//reve=(5-0+1)/2=3
//res+=0*2+1*3=3*1=3
/*
根据题意逐步计算子数组的和,发现每个数字都多次出现,多次计算,故思考能否直接计算每个数字的出现次数,思路如下:
1.任取数组下标为i(第i+1个)的元素
2.其左边可以取0~i个元素,共i+1种方案,其中(i+1)/2种为奇数,i/2+1种为偶数
3.右边可以取0~(n-i-1)个元素,共n-i种方案,其中(n-i)/2种为奇数,(n-i+1)/2种为偶数
4.合成子数组须满足条件:左边+本身+右边 = 奇数个,故左奇->右奇,左偶->右偶
5.所以arr[i]的出现次数为lOdd X rOdd + lEven X rEven,即左奇X右奇 + 左偶X右偶
注:不会出现所谓的重复统计,因为每次都计算不同数字的出现次数
*/for(int i=0;i<arrSize;i++){lOdd = (i+1)/2;lEven = i/2 + 1;rOdd = (arrSize-i)/2;rEven = (arrSize-i+1)/2;res += (lOdd*rOdd + lEven*rEven) * arr[i];}return res;}
}
推出的过程:
数组:1 2 3 4 5 6 7
下标:0 1 2 3 4 5 6
0号位置:{1},{1,2,3},{1,2,3,4,5},{1,2,3,4,5,6,7}
1号位置:{2},{2,3,4},{2,3,4,5,6}
2号位置:{3},{3,4,5},{3,4,5,6,7}
3号位置:{4},{4,5,6}
4号位置:{5},{5,6,7}
5号位置:{6}
6号位置:{7}和=次数*值
数组值为1的和:(1+1+1+1)*1=4
数组值为2的和:(1+1+1+1+1+1)*2=12
数组值为3的和:8*3=16
数组值为4的和: 8*4=24
数组值为5的和:8*5=40
数组值为6的和:6*6=36
数组值为7的和:4*7=28
4+12+16+24+40+36+28=答案
这是计算的过程,然后我们关键是怎么判断每个元素出现的次数?
看看题目,题目是要计算奇数长度子数组的和 ,奇数长度!
举个例子看看,上面数组的下标为3的元素(值=4),
看4出现的情况{1,2,3,4,5},{1,2,3,4,5,6,7},{2,3,4},{2,3,4,5,6}
{3,4,5},{3,4,5,6,7},{4},{4,5,6}这八种里面出现4{1,2,3,4,5},      左边3个数+4+右边1个数
{1,2,3,4,5,6,7}   左边3个数+4+右边3个数
{2,3,4}           左边2个数+4+右边0个数
{2,3,4,5,6}       左边2个数+4+右边2个数
{3,4,5}            左边1个数+4+右边1个数
{3,4,5,6,7}         左边1个数+4+右边3个数
{4}                左边0个数+4+右边0个数
{4,5,6}              左边0个数+4+右边2个数
所以通过一个数的8种情况:
合成子数组须满足条件:左边+本身+右边 = 奇数个,故左奇->右奇,
左偶->右偶。
其左边可以取0~i个元素,共i+1种方案,其中(i+1)/2种为奇数,
i/2+1种为偶数上面下标为3(值=4)的共3+1=4种方案
4左边个数为奇数:1,2,3,4或者3,4两种情况,(i+1)/2
4左边个数为偶数:2,3,4或者4两种情况        i/2+14右边个数为奇数:4,5或者4,5,6,7两种    (n-i)/2
4右边个数为偶数:4或者4,5,6两种         (n-i+1)/2然后要得到每个元素左边的个数和每个元素右边的个数
1.任取数组下标为i(第i+1个)的元素
2.其左边可以取0~i个元素,共i+1种方案,其中(i+1)/2种为奇数,i/2+1种为偶数
3.右边可以取0~(n-i-1)个元素,共n-i种方案,其中(n-i)/2种为奇数,(n-i+1)/2种为偶数
4.合成子数组须满足条件:左边+本身+右边 = 奇数个,故左奇->右奇,左偶->右偶
5.所以arr[i]的出现次数为lOdd X rOdd + lEven X rEven,即左奇X右奇 + 左偶X右偶
注:不会出现所谓的重复统计,因为每次都计算不同数字的出现次数

!!!---1588|Sum of All Odd Length Subarrays(新)相关推荐

  1. k8s:kubeadm搭建k8s集群,加入新master节点报错

    加入新的master节点 [root@k8s-master02 ~]#kubeadm join 172.20.1.236:16443 --token 7t2weq.bjbawausm0jaxury \ ...

  2. 加/减数组中的值得到指定的和 Target Sum

    为什么80%的码农都做不了架构师?>>>    问题: You are given a list of non-negative integers, a1, a2, ..., an, ...

  3. [LeetCode] 303. Range Sum Query - Immutable

    https://leetcode.com/problems/range-sum-query-immutable/ 用一个 sum 数组,sum[i] -- nums 中选出前 i 个元素,求和所得到的 ...

  4. leetcode307. Range Sum Query - Mutable

    题目要求 Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), incl ...

  5. leetcode 303. Range Sum Query - Immutable | 303. 区域和检索 - 数组不可变(一维前缀和问题)

    题目 https://leetcode.com/problems/range-sum-query-immutable/ 题解 标准的前缀和问题,简单题,不多说,直接上代码 import java.ut ...

  6. leetcode 209. Minimum Size Subarray Sum | 209. 长度最小的子数组(Java)

    题目 https://leetcode.com/problems/minimum-size-subarray-sum/ 题解 双指针解法,左指针和右指针在合适的时候向右走,并维护一个sum 版本1 思 ...

  7. Lintcode Subarray Sum Closest

    Given an integer array, find a subarray with sum closest to zero. Return the indexes of the first nu ...

  8. Java新特性(二)

    这段时间太忙,更新的频率有点小了!刚解决了一个复杂的算法问题,现在就抽这点时间来讲讲剩下的一部分java新特性. 在上一节中我们学过泛型.自动装箱拆箱.for循环,这一节的内容是可变长参数.枚举类型和 ...

  9. 使用 C# 9.0 新语法提升 if 语句美感

    C# 语言一贯秉承简洁优美的宗旨,每次升级都会带来一些语法糖,让我们可以使代码变得更简洁.本文分享两个使用 C# 9.0 提升 if 语句美感的技巧示例. 使用属性模式代替 IsNullOrEmpty ...

最新文章

  1. 极速理解设计模式系列【目录索引】
  2. linu怎么启动oracle,请问该如何在LINUX下启动ORACLE?
  3. 成为年薪50W+的NLP工程师,需要哪些技能?
  4. HDU 1540 Tunnel Warfare 线段树区间合并
  5. dedecms手机站要同步pc站的图片
  6. SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题
  7. 查看Office365迁移任务进度状态
  8. Mysql 日志管理详解
  9. Silverlight的发布
  10. ELK详解(十)——Logstash收集Tomcat日志实战
  11. EEPlat的元数据驱动的运行引擎
  12. Django REST框架
  13. 记一次ARM CHINA面试
  14. 【转】一个程序员分享8年的开发经验
  15. 灾害可视化:全国进入汛期,多地预警,全国多省进入暴雨洪灾状态、地图GIS数据可视化、雷达云图、等值线、等值面绘制
  16. 茶叶文化网站设计与实现 HTML+CSS学生网页设计作业源码
  17. 如何在线绘制简单又漂亮的思维导图
  18. 关于Field Exit 整理的一点资料
  19. android 反编译解析.
  20. Java JDK 下载官方网站

热门文章

  1. 入门PerfDog性能测试
  2. (五)图片压缩 —— 优化图片文件、内存
  3. 2021-9-30 背景噪声的研究
  4. 数据库连接超时的处理
  5. uniapp安卓离线打包--手把手教会
  6. 全志T3开发板——嵌入式入门学习测试教程(7)
  7. 云计算技术 实验三 安装Hadoop系统并熟悉hadoop命令
  8. sublime text 打开总是弹框报错Unable to download XXX. Please view the console for more details.解决办法
  9. python英译汉库模块_Python 进阶之路-翻译模块
  10. matlab 滤波器篇