当前位置: 首页 > news >正文

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】

题目

给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。

示例 1:

输入:nums = [1,1,1], k = 2
输出: 2
解释: 此题 [1,1] 与 [1,1] 为两种不同的情况


示例 2:

输入:nums = [1,2,3], k = 3
输出: 2

提示:

  • 1 <= nums.length <= 2 * 104
  • 1000 <= nums[i] <= 1000
  • 107 <= k <= 107

解题思路

前置知识

前缀和

前缀和:顾名思义,是要求前缀的总和,什么是前缀,对于一个存放数字的数组而言,前缀就是指的数组的前k项,因此对应的前缀和就是数组前k项的和。前缀和一般用来求数组中连续段子数组的值的和,类似于等差数列中利用等差数列的和来求某一段子数列的和:在这里插入图片描述

 举个例子:

我们有一个数组nums = [2,4,6,1,4]

下面我们来计算nums数组的前缀和数组arr,arr[i] = arr[i-1] + nums[i]

第一个元素由于没有前缀所以只能是nums[0],也就是2 

 第二个元素就等于arr[1] = arr[0] + nums[1]

 

 

 

 我们得到的nums的前缀和数组就为 arr = [2,6,12,13,17]

作用:

那么我们得到这个前缀和数组到底有什么用呢?

有了前缀和数组我们就可以方便的计算出,一个数组的区间之内的和,例如我们要求出nums[2]~nums[4] 的和。

nums[2]~nums[4] =nums[2] + nums[3] +nums[4] =  arr[4] - arr[1] = 11

可以直接用前缀和数组中的两个元素求出,不用再进行相加操作。这样可以有效的减少我们的重复计算。

代码为:

    public int[] prefix(int[] nums) {int[] prefix = new int[nums.length];prefix[0] = nums[0];for (int i = 1; i < nums.length; ++i) {prefix[i] = prefix[i - 1] + nums[i];}return prefix;}

1.题目要求我们找到该数组中和为 k 的连续子数组的个数,我们可以先计算出数组的前缀和。

2.然后我们利用两个for循环遍历整个原数组,枚举求出各个区间的和,若和等于k,则answer加一,注意这里,如果区间为[0,n]时,也就是左区间为0时,区间和[0,n] 就等于 arr[n],这个情况比较特殊所以我们要单独计算。最后返回answer即可。

代码实现

class Solution {public int subarraySum(int[] nums, int k) {int[] sum = new int[nums.length];sum[0] = nums[0];for(int i = 1; i < nums.length; i++){sum[i] = sum[i-1] + nums[i];}int answer = 0;for(int i = 0; i < nums.length; i++){if(sum[i] == k){answer++;}for(int j = i + 1; j < nums.length; j++){if(  sum[j] - sum[i] == k){answer ++;}}}return answer;}
}

测试结果

 

 

http://www.lryc.cn/news/97584.html

相关文章:

  • 【JavaScript】使用Promise来处理异步调用,方法传入参数为接口,并回调接口的方法
  • grid map学习笔记1之Ubuntu18.04+ROS-melodic编译安装grid_map栅格地图及示例运行
  • postgres wal2json插件jsonb字段数据丢失问题解决
  • 华为eNSP:路由引入
  • Retrospectives on the Embodied AI Workshop(嵌入式人工智能研讨会回顾) 论文阅读
  • 「JVM」Full GC和Minor GC、Major GC
  • Asp.Net MVC 使用Log4Net
  • [元带你学: eMMC协议 29] eMMC 断电通知(PON) | 手机平板电脑断电通知
  • vue使用recorder-core.js实现录音功能
  • ThinkPHP8知识详解:给PHP8和MySQL8添加到环境变量
  • UE使用UnLua(二)
  • Appium+python自动化(二十五)-获取控件ID(超详解)
  • SDWAN组网的九大应用场景
  • el-date-picker时间范围只能选五分钟之内
  • 大数据分析案例-基于LightGBM算法构建乳腺癌分类预测模型
  • Java中的io流
  • 23 自定义控件
  • 从原理到实践,分析 Redisson 分布式锁的实现方案(二)
  • QT【day3】
  • 模版模式和策略模式的区别
  • Github搭建个人博客全攻略
  • gensim conherence model C_V 值与其他指标负相关BUG
  • QT DAY3
  • TortoiseGit(小乌龟)使用问题总结
  • 106、Redis和Mysql如何保证数据一致
  • SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密
  • k8s核心概念
  • opencv 处理的视频 保存为新视频 ,新视频 无法读取
  • 《golang设计模式》第一部分·创建型模式-02-原型模式(Prototype)
  • SpringCloudAlibaba微服务实战系列(一)Nacos服务注册发现