• LeetCode——560. 和为K的子数组


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

    示例 1 :
    
    输入:nums = [1,1,1], k = 2
    输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
    

    说明 :

    数组的长度为 [1, 20,000]。
    数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/subarray-sum-equals-k

    图示:
    image.png

    要建立累加和数组啊,然后遍历累加和数组的每个数字,首先看其是否为k,是的话结果 res 自增1,然后再加个往前的循环,这样可以快速求出所有的子数组之和,看是否为k,参见代码如下:

    暴力解法:

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

    用一个哈希表来建立连续子数组之和跟其出现次数之间的映射,初始化要加入 {0,1} 这对映射,

    解题思路是遍历数组中的数字,用 sum 来记录到当前位置的累加和,我们建立哈希表的目的是为了让我们可以快速的查找 sum-k 是否存在,即是否有连续子数组的和为 sum-k,

    如果存在的话,那么和为k的子数组一定也存在,这样当 sum 刚好为k的时候,那么数组从起始到当前位置的这段子数组的和就是k,满足题意,如果哈希表中事先没有 m[0] 项的话,

    这个符合题意的结果就无法累加到结果 res 中,这就是初始化的用途。上面讲解的内容顺带着也把 for 循环中的内容解释了,这里就不多阐述了,参见代码如下:

    哈希表

    c++

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

    Java

    public class Solution {
        public int subarraySum(int[] nums, int k) {
            int count = 0, sum = 0;
            HashMap < Integer, Integer > map = new HashMap < > ();
            map.put(0, 1);
            for (int i = 0; i < nums.length; i++) {
                sum += nums[i];
                if (map.containsKey(sum - k))
                    count += map.get(sum - k);
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
            return count;
        }
    }
    

    python

    class Solution:
        def subarraySum(self, nums: List[int], k: int) -> int:
            prefixSumArray = {0:1}
            count = 0
            prefixSum = 0
            
            for ele in nums:
                prefixSum += ele
                subArray = prefixSum - k
                
                if subArray in prefixSumArray:
                    count += prefixSumArray[subArray]
                '''
                prefixSumArray.get(prefixSum, 0)
                在hash table里查找key,如果有返回对应的value,反之返回0 
                '''
                prefixSumArray[prefixSum] = prefixSumArray.get(prefixSum, 0) + 1
            
            return count
    
  • 相关阅读:
    做过的项目介绍
    我在爱板网写的-- 【望月追忆】带你入门STM32F0系列文章
    注释:佛祖保佑--永无BUG
    【项目】----C/C++语法知识:typedef struct 用法详解
    【神舟王】----PCB 数字地 和 模拟地 处理方法
    NSDateFormatter的常用格式和格式化参数
    IOS常用开发第三方库整理
    iOS上如何让按钮文本左对齐问题(对齐方式)
    Swift学习5---协议(protocol)和扩展(extension)
    Swift学习4---枚举和结构体
  • 原文地址:https://www.cnblogs.com/wwj99/p/12342890.html
Copyright © 2020-2023  润新知