mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-06 17:44:10 +08:00
Add solution 560、1763、2164、2165、2166、2167、2169、2170、2171、2180、2181、2182、2183、
This commit is contained in:
@ -0,0 +1,15 @@
|
||||
package leetcode
|
||||
|
||||
func subarraySum(nums []int, k int) int {
|
||||
count, pre := 0, 0
|
||||
m := map[int]int{}
|
||||
m[0] = 1
|
||||
for i := 0; i < len(nums); i++ {
|
||||
pre += nums[i]
|
||||
if _, ok := m[pre-k]; ok {
|
||||
count += m[pre-k]
|
||||
}
|
||||
m[pre] += 1
|
||||
}
|
||||
return count
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package leetcode
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type question560 struct {
|
||||
para560
|
||||
ans560
|
||||
}
|
||||
|
||||
// para 是参数
|
||||
// one 代表第一个参数
|
||||
type para560 struct {
|
||||
nums []int
|
||||
k int
|
||||
}
|
||||
|
||||
// ans 是答案
|
||||
// one 代表第一个答案
|
||||
type ans560 struct {
|
||||
one int
|
||||
}
|
||||
|
||||
func Test_Problem560(t *testing.T) {
|
||||
|
||||
qs := []question560{
|
||||
|
||||
{
|
||||
para560{[]int{1, 1, 1}, 2},
|
||||
ans560{2},
|
||||
},
|
||||
|
||||
{
|
||||
para560{[]int{1, 2, 3}, 3},
|
||||
ans560{2},
|
||||
},
|
||||
|
||||
{
|
||||
para560{[]int{1}, 0},
|
||||
ans560{0},
|
||||
},
|
||||
|
||||
{
|
||||
para560{[]int{-1, -1, 1}, 0},
|
||||
ans560{1},
|
||||
},
|
||||
|
||||
{
|
||||
para560{[]int{1, -1, 0}, 0},
|
||||
ans560{3},
|
||||
},
|
||||
}
|
||||
|
||||
fmt.Printf("------------------------Leetcode Problem 560------------------------\n")
|
||||
|
||||
for _, q := range qs {
|
||||
_, p := q.ans560, q.para560
|
||||
fmt.Printf("【input】:%v 【output】:%v\n", p, subarraySum(p.nums, p.k))
|
||||
}
|
||||
fmt.Printf("\n\n\n")
|
||||
}
|
58
leetcode/0560.Subarray-Sum-Equals-K/README.md
Normal file
58
leetcode/0560.Subarray-Sum-Equals-K/README.md
Normal file
@ -0,0 +1,58 @@
|
||||
# [560. Subarray Sum Equals K](https://leetcode.com/problems/subarray-sum-equals-k/)
|
||||
|
||||
|
||||
## 题目
|
||||
|
||||
Given an array of integers `nums` and an integer `k`, return *the total number of continuous subarrays whose sum equals to `k`*.
|
||||
|
||||
**Example 1:**
|
||||
|
||||
```
|
||||
Input: nums = [1,1,1], k = 2
|
||||
Output: 2
|
||||
|
||||
```
|
||||
|
||||
**Example 2:**
|
||||
|
||||
```
|
||||
Input: nums = [1,2,3], k = 3
|
||||
Output: 2
|
||||
|
||||
```
|
||||
|
||||
**Constraints:**
|
||||
|
||||
- `1 <= nums.length <= 2 * 104`
|
||||
- `-1000 <= nums[i] <= 1000`
|
||||
- `-10^7 <= k <= 10^7`
|
||||
|
||||
## 题目大意
|
||||
|
||||
给你一个整数数组 `nums` 和一个整数 `k` ,请你统计并返回该数组中和为 `k` ****的连续子数组的个数。
|
||||
|
||||
## 解题思路
|
||||
|
||||
- 此题不能使用滑动窗口来解。因为 `nums[i]` 可能为负数。
|
||||
- 前缀和的思路可以解答此题,但是时间复杂度有点高了,`O(n^2)`。考虑优化时间复杂度。
|
||||
- 题目要求找到连续区间和为 `k` 的子区间总数,即区间 `[i,j]` 内的和为 K ⇒ `prefixSum[j] - prefixSum[i-1] == k`。所以 `prefixSum[j] == k - prefixSum[i-1]` 。这样转换以后,题目就转换成类似 A + B = K 的问题了。LeetCode 第一题的优化思路拿来用。用 map 存储累加过的结果。如此优化以后,时间复杂度 `O(n)`。
|
||||
|
||||
## 代码
|
||||
|
||||
```go
|
||||
package leetcode
|
||||
|
||||
func subarraySum(nums []int, k int) int {
|
||||
count, pre := 0, 0
|
||||
m := map[int]int{}
|
||||
m[0] = 1
|
||||
for i := 0; i < len(nums); i++ {
|
||||
pre += nums[i]
|
||||
if _, ok := m[pre-k]; ok {
|
||||
count += m[pre-k]
|
||||
}
|
||||
m[pre] += 1
|
||||
}
|
||||
return count
|
||||
}
|
||||
```
|
Reference in New Issue
Block a user