LeetCode 1588. Sum of All Odd Length Subarrays

2023-09-15 15:17:04

Given an array of positive integers arr, return the sum of all possible odd-length subarrays of arr.

subarray is a contiguous subsequence of the array.

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

Follow up:

Could you solve this problem in O(n) time complexity?


这题好难,呜。要求一个数组里所有奇数长度的subarray里所有element的sum。看了答案感觉也没有特别理解这个解法,感觉kind of像是硬背下来了这个公式,然后套公式就完事了,公式的推导过程有点难。

我现在的理解就是,我们考虑包含arr[i]这个数字的subarray。

首先考虑以它为subarray的start的,那么这个个数就是arr.length - i。比如长度为5的数组0 1 2 3 4,以第一个元素开始的subarray可以有5个,分别是长度为1 2 3 4 5,以第二个元素开始的subarray就是4个,长度分别是1 2 3 4。然后考虑以它为subarray的end的,个数是i + 1,比如以第一个元素结尾的subarray只有长度为1的它自己,以第二个元素结尾的就有两个。

然后下面这步我没有特别理解,视频里给的例子是从a->b->c,a->b有两个方法,b->c有三个方法,那么a->c就有2 * 3 = 6个方法。还没有很理解为什么这个例子能够迁移到这道题上。我就默认就是这样的吧,于是包含arr[i]的所有subarray的个数就是start * end。

再下一步理解了一会儿,那么我们知道subarray的个数了,这时候怎么知道有多少odd和多少even。其实理论上来说应该是一半一半,但是当长度为奇数的时候,odd应该会比even多一个,偶数的时候就是正好一半一半。怎么把这两种情况合并呢?可以采用(subarray + 1) / 2的方法,如果长度为奇数就正好是subarray一半多一个,如果长度为偶数这个+1不会有任何的副作用。于是我们就知道了有多少奇数长度的subarray了。

于是最后用arr[i] * subarray个数,遍历一遍整个数组,最后就是题目要求的结果了。

class Solution {
    public int sumOddLengthSubarrays(int[] arr) {
        int result = 0;
        for (int i = 0; i < arr.length; i++) {
            int end = i + 1;
            int start = arr.length - i;
            int timeInSubarray = start * end;
            int oddTime = (timeInSubarray + 1) / 2;
            result += (oddTime * arr[i]);
        }
        return result;
    }
}

reference:

LeetCode - The World's Leading Online Programming Learning Platform

https://youtu.be/J5IIH35EBVE

更多推荐

Pikachu Burte Force(暴力破解)

一、BurteForce(暴力破解)概述​“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。​理论上来说,大多数系统都是可以被暴力破解的,只要

【Vue】快速入门和生命周期

目录前言一、vue的介绍1.Vue.js是什么?2.库和框架的区别3.基本概念和用法:二、MVVM的介绍1.什么是MVVM?2.MVVM的组成部分3.MVVM的工作流程4.MVVM的优势5.MVVM的应用场景三、vue实例1.模板语法:2.双向数据绑定3.虚拟dom实例四、vue生命周期钩子总结前言Vue.js是一款流

数据在C++中的大小(占用内存)

C++中的大小(占用内存)摘要正文获取数据类型的大小注意结论摘要在C++中,了解数据类型的大小及其在内存中的占用情况对于编写高效的代码至关重要。本文将介绍C++中不同数据类型的大小以及如何计算它们所占用的内存空间。正文在C++中,每个数据类型都有不同的字节大小,这取决于编译器和操作系统的实现。下面是一些常见的数据类型及

fastjson反序列化漏洞(CVE-2017-18349)

文章目录fastjson序列化FastJson序列化操作反序列化漏洞原理漏洞复现(CVE-2017-18349)fastjsonfastjson是阿里巴巴开发的java语言编写的高性能JSON库,用于将数据在Json和JavaObject之间相互转换。它没有用java的序列化机制,而是自定义了一套序列化机制。提供两个主

Open Interpreter,一个让ChatGPT入驻你的电脑并获得联网能力成为贾维斯!

OpenInterpreter,一个让ChatGPT入驻你的电脑并获得联网能力成为贾维斯!介绍安装使用介绍最近看了Github最近大火的程序员终端大升级,发现了openinterpreter这个可以部署到本地命令行的对话AI,其依赖ChatGPT,可以使用联网功能和本地模型,很好地拓展了原有的功能并且能结合物理设备软硬

勇立潮头!高品质SFT语音数据实现Zero-Shot语音复刻大模型

文本到语音合成(TexttoSpeech,TTS)作为生成式人工智能(GenerativeAI或AIGC)的重要课题,在近年来取得了飞速发展。为了实现高效合成既自然又高质量的人类语音,有不少机构及企业都进行了相关项目的研究,包括微软亚洲研究院机器学习组和微软Azure语音团队去年推出的NaturalSpeech(htt

企业微信 API 接口调用教程:图文详解企业微信 API 的使用方法

本文通过access_token凭证的方式来讲解怎么调用企业微信API,并一步步介绍如何获取企业微信API的corpsecret、corpid、access_token凭证以及怎么向企业微信的应用发送消息。企业微信API在线地址为:概述-企业微信API,这个在线地址的项目你可以克隆到Apifox,以方便调试。话不多说,

基于深度学习的加密恶意流量检测

加密恶意流量检测研究目标定位数据收集数据处理基于特征分类算法的数据预处理基于源数据分类算法的数据预处理特征提取模型选择基于数据特征的深度学习检测算法基于特征自学习的深度学习检测算法训练和评估精确性指标实时性指标应用检验改进摘录自:MingfangZHAI,XingmingZHANG,BoZHAO.Surveyofenc

应用在苹果应用商店该如何进行优化

众所周知,ASO最大化的提高应用程序在商店中的可见性,其目标是获得更多的下载量,同时它也与下载的转化率有关。1、根据应用阶段追求不同的目标。它可以是有机增长或转化率的提高,获得更多安装并降低用户获取成本,增加收入或提高保留率,达到一定的参与水平或提高每日或每月活跃用户。2、应用的文本字段。应用名称需要包含一些主要关键词

PAT 1035 插入与归并

PAT1035插入与归并题目描述思路讲解代码展示题目描述思路讲解分析:先将i指向中间序列中满足从左到右是从小到大顺序的最后一个下标,再将j指向从i+1开始,第一个不满足a[j]==b[j]的下标,如果j顺利到达了下标n,说明是插入排序,再下一次的序列是sort(a,a+i+2);否则说明是归并排序。归并排序就别考虑中间

xen-timer

目的主要了解一下armtimerspec和xen项目中timer是怎么使用,如何实现的。同时也是对学习过程的一些记录。学习链接文章链接时间子系统http://www.wowotech.net/sort/timer_subsystemarmtimerspechttps://developer.arm.com/docume

热文推荐