1 题目描述

2 解题思路

2.1 直接求解

枚举子数组的长度和首位置

class Solution:def sumOddLengthSubarrays(self, arr: List[int]) -> int:l=len(arr)ret=0for i in range(1,l+1,2):for j in range(l-i+1):ret+=sum(arr[j:j+i])return(ret)

2.2 直接求解+前缀和

class Solution:def sumOddLengthSubarrays(self, arr: List[int]) -> int:l=len(arr)s=[0]for i in arr:s.append(s[-1]+i)ret=0for i in range(1,l+1,2):#子序列长度1~l,每次增长2for j in range(l-i+1):#子序列起始点,最大为l-i(此时的终点为l-i+i-1=l-1)ret+=s[i+j]-s[j]return(ret)

2.3 双指针

首先把问题转化成,每个数存在在多少个奇数子数组中,也就是每个数重复了多少次。

很容易发现数组的第一个数,重复的次数由总长决定。奇数的子数组有多少个呢,正好是(length + 1) // 2。

那么前一个数和后一个数是否存在依赖关系呢?
        观察到,第一个数组成长度3、5、7等长度的子数组的时候,始终带着第二个数,但长度为1的时候没有第二个数出现。

同样的,从第二个数往后面组成的子数组和第一个数没有关系。
也就是说,第二个数出现了第一个数出现的次数,但是少了第一个数出现、第二个数没出现的次数。而且第二个数还比第一个数多了第二个数出现、第一个数没出现的次数。上一个数出现的次数可以记录。

那么上一个数出现,当前的数没出现有多少次呢?正好是一个递归思想,数组从0到i-1构成多少个包含i-1的子数组,就又是长度计算的。(根据对称性,这又等于从0到i-1构成多少个包含0的子数组)

当前的数出现,上一个数没出现,又正好是i到n-1构成多少个包含i的子数组,同样是长度计算的。

于是我们知道以下信息:

  • 在数组1~n中,第一位出现(n+1)//2次
  • 当前位比上一位多 (n - i + 1) // 2 - (i + 1) // 2
  • 首尾对应位置出现次数相同(对称性)
class Solution:def sumOddLengthSubarrays(self, arr: List[int]) -> int:l=len(arr)begin, end  , ret, times = 0, n - 1, 0, (n+1) // 2while begin <= end:# 对称性,前后对称位置出现的次数一样if begin< end:ret += times * (arr[l] + arr[r])else:ret += times * arr[l]begin += 1end -= 1times += (l- begin + 1) // 2 '''下一个数比前一个数多的部分:后一个数构成的不带前一个数的奇数子数组的个数也即以下一个数为第一个数,剩余数组中奇数子数组个数'''times -= (begin + 1) // 2'''下一个数比前一个数少的部分:前一个数构成的不带后一个数的奇数子数组的个数也即第一个数为首个数,到l之前为止,这一个子数组中奇数子数组的个数'''return ret

文巾解题1588. 所有奇数长度子数组的和相关推荐

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

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

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

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

  3. 计算1~n之间所有奇数之和_所有奇数长度子数组的和

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

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

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

  5. 文巾解题 面试题 01.04. 回文排列

    1 题目描述 2 解题思路 2.1 哈希表 创建一个哈希表,记录每个元素出现的次数.如果出现次数为奇数的元素只有一个或者没有,那么就是一个回文排列 class Solution:def canPerm ...

  6. 文巾解题 15. 三数之和

    1 题目描述 2 解题思路 2.1 使用两数之和函数 这种做法目前超时了,如果大家有想到合适的减时间/剪枝的方法,欢迎私信or评论~ 两数之和的方法见文巾解题 1. 两数之和_刘文巾的博客-CSDN博 ...

  7. 文巾解题 342. 4的幂

    1 题目描述 2 解题思路 2.1 方法1 判断log函数的结果是不是整数 class Solution:def isPowerOfFour(self, n: int) -> bool:if(n ...

  8. 文巾解题 477. 汉明距离总和

    1 题目描述 2 解题思路 2.1 暴力两两比较 两个数字之间的汉明距离可以使用 文巾解题 461. 汉明距离_刘文巾的博客-CSDN博客 中的任何一种方法,但是因为这个是两两比较,时间复杂度比较高, ...

  9. 文巾解题 1035. 不相交的线

    1 题目描述 2 解题思路 k条互不相交的直线分别连接了数组 nums1和nums2的 k 对相等的元素,而且这 k 对相等的元素在两个数组中的相对顺序是一致的,因此,这 k 对相等的元素组成的序列即 ...

最新文章

  1. 为什么在Ruby中使用`rescue Exception =gt; e`样式不好?
  2. genius choice for gopro
  3. hdu5389(DP)
  4. idea shell 中的函数 跳转_PHP如何为函数执行设置超时?
  5. Web 趋势榜:上周最热门的 10 大 Web 项目 - 210410
  6. 远程管理,无需在机房来回穿梭
  7. 【.Net Micro Framework PortingKit(补) – 1】USB驱动开发 1
  8. Zookeeper 详讲(笔记)1
  9. 剑指 Offer 57 - II. 和为s的连续正数序列 思考分析
  10. ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号
  11. 李佳琦抢了薇娅的流量
  12. 卸任四家锤子公司法定代表人后:罗永浩退出聊天宝股东行列
  13. 分区助手合并移动硬盘分区后,无法访问的解决方法
  14. 加拿大女王大学计算机排名,加拿大女王大学排名世界排名是第几
  15. RecyclerView实现横向滚动
  16. Dreamweaver CS6安装教程
  17. ccxprocess启动项可以禁用么_启动项禁用
  18. Unity C# compiler: CS0121: The call is ambiguous between the following methods or properties
  19. 手机视频剪辑软件哪个会比较好用?
  20. SQL Server建库建表命令

热门文章

  1. Android应用程序窗口(Activity)的视图对象(View)的创建过程分析
  2. python绝技 — 侦听802.11 Probe请求
  3. PAT甲级1125 Chain the Ropes:[C++题解]贪心、优先队列、合并果子
  4. 华为手机鸿蒙系统名单,鸿蒙系统:前三批升级名单曝光,有荣耀手机!
  5. 手机版网页需要上服务器吗,手机能做网页服务器吗
  6. adb查看某个文件是否存在_动能定理是否存在某个方向的分量方程式?
  7. python翻译成matlab_matlab语言转译成python
  8. java 市场_java市场前景怎样?
  9. 戴维南定律和诺顿定律
  10. STM32分类及命名方法