当前位置: 面试刷题>> 移除k位 (经典算法题500道)


题目描述补充

题目:给定一个非负整数数组 nums 和一个整数 k,你需要找到该数组中和为 k 的子数组的个数。子数组是数组中元素的连续非空序列。

示例 1:

输入: nums = [1,1,1], k = 2
输出: 2
解释: 子数组 [1,1] 和 [1,1] 的和均为 2,且它们都是长度为 2 的连续子数组。

示例 2:

输入: nums = [1,2,3], k = 3
输出: 2
解释: 子数组 [1, 2] 和 [3] 的和均为 3,且它们都是长度为 1 或 2 的连续子数组。

解题思路

这个问题可以使用前缀和(Prefix Sum)结合哈希表(Hash Table)来解决。我们遍历数组,同时计算当前位置之前的所有元素的和(前缀和),并存储在哈希表中。每当我们计算出一个新的前缀和时,我们检查哈希表中是否已经存在一个前缀和,使得两者之差为 k。如果存在,则意味着从该前缀和对应的位置到当前位置之间的子数组和就是 k

PHP 示例代码

function subarraySum($nums, $k) {
    $count = 0;
    $sum = 0;
    $prefixSum = array(0 => 1); // 初始化前缀和为0的计数为1,用于处理数组开始即为k的情况

    foreach ($nums as $num) {
        $sum += $num;
        if (isset($prefixSum[$sum - $k])) {
            $count += $prefixSum[$sum - $k];
        }
        if (!isset($prefixSum[$sum])) {
            $prefixSum[$sum] = 0;
        }
        $prefixSum[$sum]++;
    }

    return $count;
}

// 示例测试
$nums = [1,1,1];
$k = 2;
echo subarraySum($nums, $k); // 输出: 2

Python 示例代码

def subarraySum(nums, k):
    count = 0
    prefix_sum = 0
    prefix_count = {0: 1}  # 初始化前缀和为0的计数为1

    for num in nums:
        prefix_sum += num
        if prefix_sum - k in prefix_count:
            count += prefix_count[prefix_sum - k]
        if prefix_sum not in prefix_count:
            prefix_count[prefix_sum] = 0
        prefix_count[prefix_sum] += 1

    return count

# 示例测试
nums = [1,1,1]
k = 2
print(subarraySum(nums, k))  # 输出: 2

JavaScript 示例代码

function subarraySum(nums, k) {
    let count = 0;
    let prefixSum = 0;
    let prefixCount = {0: 1}; // 初始化前缀和为0的计数为1

    for (let num of nums) {
        prefixSum += num;
        if (prefixCount[prefixSum - k]) {
            count += prefixCount[prefixSum - k];
        }
        if (!prefixCount[prefixSum]) {
            prefixCount[prefixSum] = 0;
        }
        prefixCount[prefixSum]++;
    }

    return count;
}

// 示例测试
const nums = [1,1,1];
const k = 2;
console.log(subarraySum(nums, k)); // 输出: 2

码小课网站中有更多相关内容分享给大家学习,涵盖算法设计、数据结构、面试技巧等多个方面,帮助大家提升编程技能。

推荐面试题