Skip to content

Commit 5d7c0f4

Browse files
committed
Add solution 560、1763、2164、2165、2166、2167、2169、2170、2171、2180、2181、2182、2183、
1 parent deed0a6 commit 5d7c0f4

File tree

71 files changed

+4843
-855
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+4843
-855
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package leetcode
2+
3+
func subarraySum(nums []int, k int) int {
4+
count, pre := 0, 0
5+
m := map[int]int{}
6+
m[0] = 1
7+
for i := 0; i < len(nums); i++ {
8+
pre += nums[i]
9+
if _, ok := m[pre-k]; ok {
10+
count += m[pre-k]
11+
}
12+
m[pre] += 1
13+
}
14+
return count
15+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question560 struct {
9+
para560
10+
ans560
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para560 struct {
16+
nums []int
17+
k int
18+
}
19+
20+
// ans 是答案
21+
// one 代表第一个答案
22+
type ans560 struct {
23+
one int
24+
}
25+
26+
func Test_Problem560(t *testing.T) {
27+
28+
qs := []question560{
29+
30+
{
31+
para560{[]int{1, 1, 1}, 2},
32+
ans560{2},
33+
},
34+
35+
{
36+
para560{[]int{1, 2, 3}, 3},
37+
ans560{2},
38+
},
39+
40+
{
41+
para560{[]int{1}, 0},
42+
ans560{0},
43+
},
44+
45+
{
46+
para560{[]int{-1, -1, 1}, 0},
47+
ans560{1},
48+
},
49+
50+
{
51+
para560{[]int{1, -1, 0}, 0},
52+
ans560{3},
53+
},
54+
}
55+
56+
fmt.Printf("------------------------Leetcode Problem 560------------------------\n")
57+
58+
for _, q := range qs {
59+
_, p := q.ans560, q.para560
60+
fmt.Printf("【input】:%v 【output】:%v\n", p, subarraySum(p.nums, p.k))
61+
}
62+
fmt.Printf("\n\n\n")
63+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# [560. Subarray Sum Equals K](https://leetcode.com/problems/subarray-sum-equals-k/)
2+
3+
4+
## 题目
5+
6+
Given an array of integers `nums` and an integer `k`, return *the total number of continuous subarrays whose sum equals to `k`*.
7+
8+
**Example 1:**
9+
10+
```
11+
Input: nums = [1,1,1], k = 2
12+
Output: 2
13+
14+
```
15+
16+
**Example 2:**
17+
18+
```
19+
Input: nums = [1,2,3], k = 3
20+
Output: 2
21+
22+
```
23+
24+
**Constraints:**
25+
26+
- `1 <= nums.length <= 2 * 104`
27+
- `-1000 <= nums[i] <= 1000`
28+
- `-10^7 <= k <= 10^7`
29+
30+
## 题目大意
31+
32+
给你一个整数数组 `nums` 和一个整数 `k` ,请你统计并返回该数组中和为 `k` ****的连续子数组的个数。
33+
34+
## 解题思路
35+
36+
- 此题不能使用滑动窗口来解。因为 `nums[i]` 可能为负数。
37+
- 前缀和的思路可以解答此题,但是时间复杂度有点高了,`O(n^2)`。考虑优化时间复杂度。
38+
- 题目要求找到连续区间和为 `k` 的子区间总数,即区间 `[i,j]` 内的和为 K ⇒ `prefixSum[j] - prefixSum[i-1] == k`。所以 `prefixSum[j] == k - prefixSum[i-1]` 。这样转换以后,题目就转换成类似 A + B = K 的问题了。LeetCode 第一题的优化思路拿来用。用 map 存储累加过的结果。如此优化以后,时间复杂度 `O(n)`
39+
40+
## 代码
41+
42+
```go
43+
package leetcode
44+
45+
func subarraySum(nums []int, k int) int {
46+
count, pre := 0, 0
47+
m := map[int]int{}
48+
m[0] = 1
49+
for i := 0; i < len(nums); i++ {
50+
pre += nums[i]
51+
if _, ok := m[pre-k]; ok {
52+
count += m[pre-k]
53+
}
54+
m[pre] += 1
55+
}
56+
return count
57+
}
58+
```
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
func Test_Problem677(t *testing.T) {
9+
obj := Constructor()
10+
fmt.Printf("obj = %v\n", obj)
11+
obj.Insert("apple", 3)
12+
fmt.Printf("obj = %v\n", obj)
13+
fmt.Printf("obj.sum = %v\n", obj.Sum("ap"))
14+
obj.Insert("app", 2)
15+
fmt.Printf("obj = %v\n", obj)
16+
fmt.Printf("obj.sum = %v\n", obj.Sum("ap"))
17+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package leetcode
2+
3+
import "unicode"
4+
5+
// 解法一 分治,时间复杂度 O(n)
6+
func longestNiceSubstring(s string) string {
7+
if len(s) < 2 {
8+
return ""
9+
}
10+
11+
chars := map[rune]int{}
12+
for _, r := range s {
13+
chars[r]++
14+
}
15+
16+
for i := 0; i < len(s); i++ {
17+
r := rune(s[i])
18+
_, u := chars[unicode.ToUpper(r)]
19+
_, l := chars[unicode.ToLower(r)]
20+
if u && l {
21+
continue
22+
}
23+
left := longestNiceSubstring(s[:i])
24+
right := longestNiceSubstring(s[i+1:])
25+
if len(left) >= len(right) {
26+
return left
27+
} else {
28+
return right
29+
}
30+
}
31+
return s
32+
}
33+
34+
// 解法二 用二进制表示状态
35+
func longestNiceSubstring1(s string) (ans string) {
36+
for i := range s {
37+
lower, upper := 0, 0
38+
for j := i; j < len(s); j++ {
39+
if unicode.IsLower(rune(s[j])) {
40+
lower |= 1 << (s[j] - 'a')
41+
} else {
42+
upper |= 1 << (s[j] - 'A')
43+
}
44+
if lower == upper && j-i+1 > len(ans) {
45+
ans = s[i : j+1]
46+
}
47+
}
48+
}
49+
return
50+
}
51+
52+
// 解法三 暴力枚举,时间复杂度 O(n^2)
53+
func longestNiceSubstring2(s string) string {
54+
res := ""
55+
for i := 0; i < len(s); i++ {
56+
m := map[byte]int{}
57+
m[s[i]]++
58+
for j := i + 1; j < len(s); j++ {
59+
m[s[j]]++
60+
if checkNiceString(m) && (j-i+1 > len(res)) {
61+
res = s[i : j+1]
62+
}
63+
}
64+
}
65+
return res
66+
}
67+
68+
func checkNiceString(m map[byte]int) bool {
69+
for k := range m {
70+
if k >= 97 && k <= 122 {
71+
if _, ok := m[k-32]; !ok {
72+
return false
73+
}
74+
}
75+
if k >= 65 && k <= 90 {
76+
if _, ok := m[k+32]; !ok {
77+
return false
78+
}
79+
}
80+
}
81+
return true
82+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question1763 struct {
9+
para1763
10+
ans1763
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para1763 struct {
16+
s string
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans1763 struct {
22+
one string
23+
}
24+
25+
func Test_Problem1763(t *testing.T) {
26+
27+
qs := []question1763{
28+
29+
{
30+
para1763{"YazaAay"},
31+
ans1763{"aAa"},
32+
},
33+
34+
{
35+
para1763{"Bb"},
36+
ans1763{"Bb"},
37+
},
38+
39+
{
40+
para1763{"c"},
41+
ans1763{""},
42+
},
43+
}
44+
45+
fmt.Printf("------------------------Leetcode Problem 1763------------------------\n")
46+
47+
for _, q := range qs {
48+
_, p := q.ans1763, q.para1763
49+
fmt.Printf("【input】:%v 【output】:%v\n", p, longestNiceSubstring(p.s))
50+
}
51+
fmt.Printf("\n\n\n")
52+
}

0 commit comments

Comments
 (0)