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

这篇具有很好参考价值的文章主要介绍了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项的和。前缀和一般用来求数组中连续段子数组的值的和,类似于等差数列中利用等差数列的和来求某一段子数列的和:Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组

 举个例子:

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

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组

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

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

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组 第二个元素就等于arr[1] = arr[0] + nums[1]

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组 Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组 

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组 

 我们得到的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;
    }
}

测试结果

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】,算法每日一题,leetcode,算法,职场和发展,java,数组 

 文章来源地址https://www.toymoban.com/news/detail-606889.html

到了这里,关于Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (字符串 ) 剑指 Offer 58 - II. 左旋转字符串 ——【Leetcode每日一题】

    难度:简单 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串\\\"abcdefg\\\"和数字2,该函数将返回左旋转两位得到的结果\\\"cdefgab\\\"。 示例 1: 输入: s = “abcdefg”, k = 2 输出: “cdefgab” 示例 2:

    2024年02月08日
    浏览(48)
  • Leetcode 剑指 Offer II 038. 每日温度

    题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的

    2024年02月14日
    浏览(46)
  • Leetcode-每日一题【剑指 Offer 29. 顺时针打印矩阵】

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入: matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出: [1,2,3,4,8,12,11,10,9,5,6,7] 限制: 0 = matrix.length = 100 0 = matrix[i].length = 100 1.题目要求

    2024年02月13日
    浏览(57)
  • (链表) 剑指 Offer 24. 反转链表 ——【Leetcode每日一题】

    难度:简单 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入 : 1-2-3-4-5-NULL 输出 : 5-4-3-2-1-NULL 限制 : 0 = 节点个数 = 5000 注意:本题与 206. 反转链表 相同。 💡思路: 法一:递归 可以将本问题分解成子问题: 1 - (剩余部分的反转)

    2024年02月15日
    浏览(49)
  • Leetcode-每日一题【剑指 Offer 16. 数值的整数次方】

    实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入: x = 2.00000, n = 10 输出: 1024.00000 示例 2: 输入: x = 2.10000, n = 3 输出: 9.26100 示例 3: 输入: x = 2.00000, n = -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 提示: -10

    2024年02月13日
    浏览(41)
  • Leetcode-每日一题【剑指 Offer 06. 从尾到头打印链表】

    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入: head = [1,3,2] 输出: [2,3,1] 限制: 0 = 链表长度 = 10000 1.题目要求我们从尾到头反过来返回每个节点的值,这道题我们可以用栈去解决,但是我们还可以采用另一种方法。就是我们可以

    2024年02月13日
    浏览(36)
  • Leetcode-每日一题【剑指 Offer 11. 旋转数组的最小数字】

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的

    2024年02月14日
    浏览(41)
  • Leetcode-每日一题【剑指 Offer 26. 树的子结构】

    输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A:      3     /    4   5   /  1   2 给定的树 B:    4    /  1 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点

    2024年02月13日
    浏览(57)
  • Leetcode-每日一题【剑指 Offer 27. 二叉树的镜像】

    请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入:      4    /     2     7  /   / 1   3 6   9 镜像输出:      4    /     7     2  /   / 9   6 3   1 示例 1: 输入: root = [4,2,7,1,3,6,9] 输出: [4,7,2,9,6,3,1] 限制: 0 = 节点个数 = 1000 1.题目要求我们设

    2024年02月13日
    浏览(41)
  • (字符串 ) 剑指 Offer 05. 替换空格 ——【Leetcode每日一题】

    难度:简单 请实现一个函数,把字符串 s 中的每个 空格 替换成 “ %20 ”。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 限制 : 0 = s 的长度 = 10000 💡思路:双指针法 如果想把这道题目做到 极致 ,就不要只用额外的辅助空间了! 首先扩充数组到每个空格替换

    2024年02月08日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包