diff --git a/.vscode/settings.json b/.vscode/settings.json index de519b9..c8dd357 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,6 +14,7 @@ "nums", "powx", "pwwkew", + "subarray", "umghlrlose", "xuan", "zhong", diff --git a/README.md b/README.md index ba1cc1c..cdd4dd0 100644 --- a/README.md +++ b/README.md @@ -340,6 +340,11 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重 - LeetCode 50. Pow(x, n) - LintCode 428. x的n次幂 +- [和为K的子数组](src/math/subarray-sum-equals-k.js) + + - LeetCode 560. 和为K的子数组 + - LintCode 838. 子数组和为K + ## 堆 - [超级丑数](src/stack/super-ugly-number.js)【未完成】 diff --git a/src/math/subarray-sum-equals-k.js b/src/math/subarray-sum-equals-k.js new file mode 100644 index 0000000..c25f879 --- /dev/null +++ b/src/math/subarray-sum-equals-k.js @@ -0,0 +1,25 @@ +/** + * @param {number[]} nums + * @param {number} k + * @return {number} + */ +export const subarraySum = function (nums, k) { + const map = new Map() + let sum = 0 + let res = 0 + + nums.forEach((n, index) => { + sum += n + if (sum === k) res++ + const subSum = sum - k + let value = [] + if (map.has(subSum)) res += map.get(subSum).length + if (map.has(sum)) { + value = map.get(sum) + } + value.push(index) + map.set(sum, value) + }) + + return res +} diff --git a/test/math/subarray-sum-equals-k.test.js b/test/math/subarray-sum-equals-k.test.js new file mode 100644 index 0000000..7b9d63d --- /dev/null +++ b/test/math/subarray-sum-equals-k.test.js @@ -0,0 +1,5 @@ +import { subarraySum } from '../../src/math/subarray-sum-equals-k' + +test('和为K的子数组', () => { + expect(subarraySum([1, 1, 1], 2)).toBe(2) +})