diff --git "a/Index/\345\211\215\347\274\200\345\222\214.md" "b/Index/\345\211\215\347\274\200\345\222\214.md" index c92f2cc5..c9af4431 100644 --- "a/Index/\345\211\215\347\274\200\345\222\214.md" +++ "b/Index/\345\211\215\347\274\200\345\222\214.md" @@ -11,6 +11,7 @@ | [523. 连续的子数组和](https://leetcode-cn.com/problems/continuous-subarray-sum/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/continuous-subarray-sum/solution/gong-shui-san-xie-tuo-zhan-wei-qiu-fang-1juse/) | 中等 | 🤩🤩🤩🤩 | | [525. 连续数组](https://leetcode-cn.com/problems/contiguous-array/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/contiguous-array/solution/gong-shui-san-xie-qian-zhui-he-ha-xi-bia-q400/) | 中等 | 🤩🤩🤩🤩 | | [528. 按权重随机选择](https://leetcode-cn.com/problems/random-pick-with-weight/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/random-pick-with-weight/solution/gong-shui-san-xie-yi-ti-shuang-jie-qian-8bx50/) | 中等 | 🤩🤩🤩🤩 | +| [560. 和为 K 的子数组](https://leetcode.cn/problems/subarray-sum-equals-k/) | [LeetCode 题解链接](https://leetcode.cn/problems/subarray-sum-equals-k/solution/by-ac_oier-pttu/) | 中等 | 🤩🤩🤩🤩🤩 | | [629. K个逆序对数组](https://leetcode-cn.com/problems/k-inverse-pairs-array/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/k-inverse-pairs-array/solution/gong-shui-san-xie-yi-dao-xu-lie-dp-zhuan-tm01/) | 中等 | 🤩🤩🤩🤩🤩 | | [661. 图片平滑器](https://leetcode-cn.com/problems/image-smoother/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/image-smoother/solution/by-ac_oier-nn3v/) | 简单 | 🤩🤩🤩🤩 | | [689. 三个无重叠子数组的最大和](https://leetcode-cn.com/problems/maximum-sum-of-3-non-overlapping-subarrays/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/maximum-sum-of-3-non-overlapping-subarrays/solution/gong-shui-san-xie-jie-he-qian-zhui-he-de-ancx/) | 困难 | 🤩🤩🤩 | diff --git "a/Index/\345\223\210\345\270\214\350\241\250.md" "b/Index/\345\223\210\345\270\214\350\241\250.md" index 751ceae0..eab56549 100644 --- "a/Index/\345\223\210\345\270\214\350\241\250.md" +++ "b/Index/\345\223\210\345\270\214\350\241\250.md" @@ -27,6 +27,7 @@ | [500. 键盘行](https://leetcode-cn.com/problems/keyboard-row/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/keyboard-row/solution/gong-shui-san-xie-jian-dan-zi-fu-chuan-m-zx6b/) | 简单 | 🤩🤩🤩🤩 | | [519. 随机翻转矩阵](https://leetcode-cn.com/problems/random-flip-matrix/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/random-flip-matrix/solution/gong-shui-san-xie-note-bie-pian-yi-ti-sh-e6gi/) | 中等 | 🤩🤩🤩🤩 | | [554. 砖墙](https://leetcode-cn.com/problems/brick-wall/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/brick-wall/solution/gong-shui-san-xie-zheng-nan-ze-fan-shi-y-gsri/) | 中等 | 🤩🤩🤩 | +| [560. 和为 K 的子数组](https://leetcode.cn/problems/subarray-sum-equals-k/) | [LeetCode 题解链接](https://leetcode.cn/problems/subarray-sum-equals-k/solution/by-ac_oier-pttu/) | 中等 | 🤩🤩🤩🤩🤩 | | [594. 最长和谐子序列](https://leetcode-cn.com/problems/longest-harmonious-subsequence/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/longest-harmonious-subsequence/solution/gong-shui-san-xie-yi-ti-shuang-jie-hua-d-quuh/) | 简单 | 🤩🤩🤩🤩 | | [599. 两个列表的最小索引总和](https://leetcode-cn.com/problems/minimum-index-sum-of-two-lists/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/minimum-index-sum-of-two-lists/solution/by-ac_oier-oh5b/) | 简单 | 🤩🤩🤩🤩 | | [645. 错误的集合](https://leetcode-cn.com/problems/set-mismatch/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/set-mismatch/solution/gong-shui-san-xie-yi-ti-san-jie-ji-shu-s-vnr9/) | 简单 | 🤩🤩🤩 | diff --git "a/LeetCode/551-560/560. \345\222\214\344\270\272 K \347\232\204\345\255\220\346\225\260\347\273\204\357\274\210\344\270\255\347\255\211\357\274\211.md" "b/LeetCode/551-560/560. \345\222\214\344\270\272 K \347\232\204\345\255\220\346\225\260\347\273\204\357\274\210\344\270\255\347\255\211\357\274\211.md" new file mode 100644 index 00000000..40115f3c --- /dev/null +++ "b/LeetCode/551-560/560. \345\222\214\344\270\272 K \347\232\204\345\255\220\346\225\260\347\273\204\357\274\210\344\270\255\347\255\211\357\274\211.md" @@ -0,0 +1,71 @@ +### 题目描述 + +这是 LeetCode 上的 **[560. 和为 K 的子数组](https://leetcode.cn/problems/subarray-sum-equals-k/solution/by-ac_oier-pttu/)** ,难度为 **中等**。 + +Tag : 「前缀和」、「哈希表」 + + + +给你一个整数数组 `nums` 和一个整数 `k` ,请你统计并返回该数组中和为 `k` 的子数组的个数 。 + +示例 1: +``` +输入:nums = [1,1,1], k = 2 + +输出:2 +``` +示例 2: +``` +输入:nums = [1,2,3], k = 3 + +输出:2 +``` + +提示: +* $1 <= nums.length <= 2 * 10^4$ +* $-1000 <= nums[i] <= 1000$ +* $-10^7 <= k <= 10^7$ + +--- + +### 前缀和 + 哈希表 + +这是一道经典的前缀和运用题。 + +统计以每一个 $nums[i]$ 为结尾,和为 $k$ 的子数组数量即是答案。 + +我们可以预处理前缀和数组 `sum`(前缀和数组下标默认从 $1$ 开始),对于求解以某一个 $nums[i]$ 为结尾的,和为 $k$ 的子数组数量,本质上是求解在 $[0, i]$ 中,`sum` 数组中有多少个值为 $sum[i + 1] - k$ 的数,这可以在遍历过程中使用「哈希表」进行同步记录。 + +代码: +```Java +class Solution { + public int subarraySum(int[] nums, int k) { + int n = nums.length, ans = 0; + int[] sum = new int[n + 10]; + for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + nums[i - 1]; + Map map = new HashMap<>(); + map.put(0, 1); + for (int i = 1; i <= n; i++) { + int t = sum[i], d = t - k; + ans += map.getOrDefault(d, 0); + map.put(t, map.getOrDefault(t, 0) + 1); + } + return ans; + } +} +``` +* 时间复杂度:预处理前缀和的复杂度为 $O(n)$,统计答案的复杂度为 $O(n)$。整体复杂度为 $O(n)$ +* 空间复杂度:$O(n)$ + +--- + +### 最后 + +这是我们「刷穿 LeetCode」系列文章的第 `No.560` 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。 + +在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。 + +为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。 + +在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。 + diff --git "a/LeetCode/\345\211\221\346\214\207 Offer II/\345\211\221\346\214\207 Offer II 114. \345\244\226\346\230\237\346\226\207\345\255\227\345\205\270\357\274\210\345\233\260\351\232\276\357\274\211.md" "b/LeetCode/\345\211\221\346\214\207 Offer II/\345\211\221\346\214\207 Offer II 114. \345\244\226\346\230\237\346\226\207\345\255\227\345\205\270\357\274\210\345\233\260\351\232\276\357\274\211.md" index 85f644c3..de88af3e 100644 --- "a/LeetCode/\345\211\221\346\214\207 Offer II/\345\211\221\346\214\207 Offer II 114. \345\244\226\346\230\237\346\226\207\345\255\227\345\205\270\357\274\210\345\233\260\351\232\276\357\274\211.md" +++ "b/LeetCode/\345\211\221\346\214\207 Offer II/\345\211\221\346\214\207 Offer II 114. \345\244\226\346\230\237\346\226\207\345\255\227\345\205\270\357\274\210\345\233\260\351\232\276\357\274\211.md" @@ -49,7 +49,7 @@ Tag : 「图论」、「拓扑排序」、「建图」、「图论 BFS」 为了方便,我们称 `words` 为 `ws`,同时将两个字符串 `a` 和 `b` 之间的字典序关系简称为「关系」。 -由于数组长度和每个 $ws[i]$ 的最大长度均为 $100$,我们可以实现复杂度为 $O(n^3)$ 复杂度的算法。 +由于数组长度和每个 $ws[i]$ 的最大长度均为 $100$,我们可以实现复杂度为 $O(n^3)$ 的算法。 首先容易想到,我们从前往后处理每个 $ws[i]$,利用 `ws` 数组本身已按字典序排序,然后通过 $ws[i]$ 与 $ws[j]$ 的关系(其中 $j$ 的范围为 $[0, i - 1]$),来构建字符之间的关系。 @@ -67,7 +67,7 @@ class Solution { int N = 26, M = N * N, idx = 0, cnt = 0; int[] he = new int[N], e = new int[M], ne = new int[M]; int[] in = new int[N], out = new int[N]; - boolean[] vis = new boolean[26]; + boolean[] vis = new boolean[N]; void add(int a, int b) { e[idx] = b; ne[idx] = he[a];