首页 > 其他分享 >leetcode1588-所有奇数长度子数组的和

leetcode1588-所有奇数长度子数组的和

时间:2022-09-04 13:57:04浏览次数:49  
标签:arr right 奇数 int 相加 数组 leetcode1588 odd left

 

https://leetcode.cn/problems/sum-of-all-odd-length-subarrays/

虽然知道几个嵌套循环暴力可以做,但是可以明显看出每一次都要经过很多重复计算,数组中每一个数字相加的次数是不同的,于是尝试看看相加的次数有什么规律。

其中大小为5的数组相加次数分别为3 4 5 4 3,大小为7的数组相加次数分别为4 6 8 8 8 6 4,实在看不出什么规律。

后来想到可以让程序计算出各种长度的数组各个位置的数相加的次数:每一次的相加都像一个滑动窗口?

class Solution { public:     int sumOddLengthSubarrays(vector<int>& arr) {         int sizes=arr.size(),sum=0;         int count[sizes];//记录各个数相加的次数         for(int i=0;i<sizes;i++)    count[i]=1;  //不管数组的大小是奇数还是偶数,都肯定会有一次相加         for(int i=3;i<=sizes;i+=2)//控制窗口大小   //所以窗口直接从3开始         {             for(int j=0;j<=sizes-i;j++)//控制窗口的移动             {                 for(int k=j;k<j+i;k++)  count[k]++;             }         }         for(int i=0;i<sizes;i++)         {             sum = sum + count[i]*arr[i];         }         return sum;     } }; 一开始提交是count初始化为0,窗口大小从1开始,用时4ms,更改之后直接变成0ms

 

还有一种比较神奇的做法,计算各个位置数字相加次数不需要那么多层循环。

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, right_even = (right + 1) / 2,
    left_odd = left / 2, right_odd = right / 2;
    res += (left_even * right_even + left_odd * right_odd) * arr[i];
  }
  return res;
}
};

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

这个做法是先算每个位置包括它自己左右有多少个数字

因为奇数+奇数=偶数,偶数+偶数=偶数

如果左右两边分别选择的数字个数相加为偶数,则说明构成了长度为奇数的数组

 

 

 

 

标签:arr,right,奇数,int,相加,数组,leetcode1588,odd,left
From: https://www.cnblogs.com/uacs2024/p/16654970.html

相关文章

  • 448. 找到所有数组中消失的数字
     思路难度简单1065收藏分享切换为英文接收动态反馈给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1,n] 内。请你找出所有在 [1,n] 范围内但......
  • leetcode215:数组中的第K个最大元素
    packagecom.mxnet;importjava.util.Random;publicclassSolution215{//生成随机数Randomrandom=newRandom();/***给定整数数组nums和......
  • 数组元素循环右移n位
    7-4数组元素循环右移n位分数15作者周永单位西南石油大学从键盘接收两个整数m和n,分别表示一维整型数组的元素个数,和要向移动的位数。已知0<m<=100,以及n>0。在用户......
  • numpy数组扩展函数repeat和tile用法
    numpy数组扩展函数repeat和tile用法【Python学习】Numpy函数repeat和tile用法 ......
  • Leetcode — 34. 查找有序数组中元素的第一个和最后一个位置
    Leetcode—34.查找有序数组中元素的第一个和最后一个位置题目:查找排序数组中元素的第一个和最后一个位置难度:medium语言:Python中文题意:给一串以递增排序的整数......
  • 解码异或后的数组
    一、题目描述给定一个非负整数数组arr,经过编码后新数组encode的长度为n-1,编码的规则为encode[i]=arr[i]★arr[i+1](★为异或符)。给出编码后encode数组,和原来数组......
  • linux awk数组操作详细介绍
    linuxawk数组操作详细介绍-程默-博客园 https://www.cnblogs.com/chengmo/archive/2010/10/08/1846190.html用awk进行文本处理,少不了就是它的数组处理。那么awk数......
  • echarts爬坑记—数组反转reverse导致源数据发生改变
    原文链接:echarts爬坑记—数组反转reverse导致源数据发生改变–每天进步一点点(longkui.site) 0.背景上一篇文章中介绍了echarts让饼图数据和图例位置发生改变的。......
  • 创建员工表格,遍历数组获取每个员工,并且渲染到表格中
    首先是CSS部分,根据需求添加属性,可以调整  再是盒子部分  接下来是js部分:重点就是JS部分,利用遍历数组获取每个员工,再进行渲染,注意for下面的console.log(` 这里......
  • 信息学一本通 1177:奇数单增序列
    时间限制:1000ms      内存限制:65536KB提交数:37879   通过数:19375【题目描述】给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出......