LeetCode - 和为K的子数组

LCR 010. 和为 K 的子数组

看到这道题的时候,感觉还挺简单的,找到数组中和为k的连续子数组的个数,无非就是一个区间减去另一个区间的和等于k,然后想到了用前缀和来解决这道问题。再算连续子数组出现的个数的时候,可以使用暴力枚举,将个数全部算出来。然后在暴力枚举的基础上进行优化

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        
        int n = nums.size();
        vector<int> lnum(n + 1, 0);
        for (int i = 1; i <= n; i++)
        {
            lnum[i] = lnum[i - 1] + nums[i - 1];
        }
        int ans = 0;

        for (int i = 1; i <= n; i++)
        {
            for (int j = i; j <= n; j++)
            {
                if (lnum[j] - lnum[i - 1] == k)
                {
                    ans++;
                }
            }
        }

        return ans;

    }
};

代码优化,如何对这个代码进行优化?最开始我想到了双指针,如果都是正数,前缀和数组保证严格单调递增,第二层for循环可以只要可以判断成功一次即可,但是题目中给的范围是存在负数和0的,所以双指针是不行的。

换一种思路,对公式下手

假设前缀和数组为pre
pre[r] - pre[l - 1] = k;
pre[l - 1] = pre[r] - k;
写到这里,我们只需要找到有多少个前缀和是pre[r] - k即可。既然涉及到统计次数,那么就可以使用
哈希。所以对于两层for循环,考虑使用哈希进行优化。
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        
        int n = nums.size();
        vector<int> lnum(n + 1, 0);
        for (int i = 1; i <= n; i++)
        {
            lnum[i] = lnum[i - 1] + nums[i - 1];
        }
        int ans = 0;

        unordered_map<int,int> hash;
        hash[0] = 1; // 第0个位置也要算上,防止出现nums中第一个数字单独构成子数组
        for (int i = 1; i <= n; i++)
        {
            if (hash.find(lnum[i] - k) != hash.end()) // 如果在hash中找不到pre[r] - k
            {
                ans += hash[lnum[i] - k];// 找到有多少个前缀和是pre[r] - k,让ans加上即可
            }
            hash[lnum[i]]++;
        }

        return ans;

    }
};

相关推荐

  1. leetcodeK数组

    2024-03-16 22:52:02       56 阅读
  2. K数组LeetCode 560)

    2024-03-16 22:52:02       57 阅读
  3. leetcode560k数组

    2024-03-16 22:52:02       57 阅读
  4. LeetCode 560 K数组

    2024-03-16 22:52:02       43 阅读
  5. 560.K数组

    2024-03-16 22:52:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 22:52:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 22:52:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 22:52:02       87 阅读
  4. Python语言-面向对象

    2024-03-16 22:52:02       96 阅读

热门阅读

  1. 第1章第2节:SAS语言基础

    2024-03-16 22:52:02       41 阅读
  2. 3月16日ACwing每日一题

    2024-03-16 22:52:02       47 阅读
  3. View UI清除表单

    2024-03-16 22:52:02       38 阅读
  4. 构建专业聊天软件:C#编程深度解析

    2024-03-16 22:52:02       42 阅读
  5. 树莓派开机自动播放U盘里的照片和视频

    2024-03-16 22:52:02       68 阅读
  6. pre_min[0:10, 2:3] = pre和pre_min[0:10, 2] = pre区别

    2024-03-16 22:52:02       42 阅读
  7. H5/微信 Video标签移动端播放问题

    2024-03-16 22:52:02       69 阅读
  8. int与integer的区别

    2024-03-16 22:52:02       39 阅读
  9. AI -朴素贝叶斯

    2024-03-16 22:52:02       44 阅读
  10. 从零学算法76

    2024-03-16 22:52:02       36 阅读
  11. AWTK 开源串口屏的配置文件

    2024-03-16 22:52:02       41 阅读