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. shell5.0密钥_8.使用Xshell5密钥登录liunx
  2. arm shell 获取本地键盘输入值_linux下获取按键响应事件【转】
  3. “光纤之父”高锟离世,感谢他的贡献
  4. linux c数字转字符串函数,Linux常用C函数—字符串转换篇
  5. linux 清理指定大小的文件
  6. VC开发多语言界面支持的简单方法
  7. [分享]iOS开发-如何使用tabBarController
  8. 简哲,请让我的生活简单一点。——批《输入法破局研究——联盟推广》
  9. model中的数据如何显示在html上,django – 使用DRF ModelViewSet和TemplateHTMLRenderer时如何访问模板中的数据?...
  10. oracle 删除jobs日志,修改Oracle的Job Scheduler 日志级别及删除运行日志
  11. 毕业设计--MySqL的初探
  12. 智能手机安全:黑客是如何秘密控制你手机号码
  13. 邮件中的FYI和PFA代表什么意思
  14. 看到的不错的产品助理面试题
  15. 引用 孙悟空的师傅菩提祖师的真实真份和镇元大仙辈份排名+四大灵猴
  16. java 套接字关联的通道_java.nio.channels.SocketChannel
  17. 求购安霸Ambarella IONE这颗料的SDK开发工具包 Software Development Kit
  18. Cuckoo针对恶意软件自动化分析系统
  19. 一念起,天涯咫尺;一念灭,咫尺天涯。—第八天
  20. 集成电路模拟版图入门-版图基础学习笔记(二)

热门文章

  1. 写一副对子_一副对子的传奇故事
  2. 类似火车头的采集器-免费任意数据采集器
  3. java_多线程下载
  4. Android 单线程下载与多线程下载
  5. UML是什么?UML不是什么?
  6. C++文件流fstream相关操作
  7. linux 命令行 英语词典
  8. 微软翻译与服务器断开,一水的机翻?微软中文翻译也闹笑话了
  9. Linux bash 数组 for循环遍历
  10. SpringBoot实现CRUD