Skip to content

Commit 0cafb8d

Browse files
committed
提交尝试但未通过的题
1 parent 4e11f40 commit 0cafb8d

18 files changed

+867
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package leetcode
2+
3+
func maximalRectangle(matrix [][]byte) int {
4+
return 0
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question85 struct {
9+
para85
10+
ans85
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para85 struct {
16+
one [][]byte
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans85 struct {
22+
one int
23+
}
24+
25+
func Test_Problem85(t *testing.T) {
26+
27+
qs := []question85{
28+
29+
question85{
30+
para85{[][]byte{[]byte{'1', '0', '1', '0', '0'}, []byte{'1', '0', '1', '1', '1'}, []byte{'1', '1', '1', '1', '1'}, []byte{'1', '0', '0', '1', '0'}}},
31+
ans85{6},
32+
},
33+
}
34+
35+
fmt.Printf("------------------------Leetcode Problem 85------------------------\n")
36+
37+
for _, q := range qs {
38+
_, p := q.ans85, q.para85
39+
fmt.Printf("【input】:%v 【output】:%v\n", p, maximalRectangle(p.one))
40+
}
41+
fmt.Printf("\n\n\n")
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package leetcode
2+
3+
func minCut(s string) int {
4+
if s == "" {
5+
return 0
6+
}
7+
result := len(s)
8+
current := make([]string, 0, len(s))
9+
dfs132(s, 0, current, &result)
10+
return result
11+
}
12+
13+
func dfs132(s string, idx int, cur []string, result *int) {
14+
start, end := idx, len(s)
15+
if start == end {
16+
*result = min(*result, len(cur)-1)
17+
return
18+
}
19+
for i := start; i < end; i++ {
20+
if isPal(s, start, i) {
21+
dfs132(s, i+1, append(cur, s[start:i+1]), result)
22+
}
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question132 struct {
9+
para132
10+
ans132
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para132 struct {
16+
s string
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans132 struct {
22+
one int
23+
}
24+
25+
func Test_Problem132(t *testing.T) {
26+
27+
qs := []question132{
28+
29+
question132{
30+
para132{"aab"},
31+
ans132{1},
32+
},
33+
}
34+
35+
fmt.Printf("------------------------Leetcode Problem 132------------------------\n")
36+
37+
for _, q := range qs {
38+
_, p := q.ans132, q.para132
39+
fmt.Printf("【input】:%v 【output】:%v\n", p, minCut(p.s))
40+
}
41+
fmt.Printf("\n\n\n")
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package leetcode
2+
3+
func removeDuplicateLetters(s string) string {
4+
return ""
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question316 struct {
9+
para316
10+
ans316
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para316 struct {
16+
one string
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans316 struct {
22+
one string
23+
}
24+
25+
func Test_Problem316(t *testing.T) {
26+
27+
qs := []question316{
28+
29+
question316{
30+
para316{"bcabc"},
31+
ans316{"abc"},
32+
},
33+
question316{
34+
para316{"cbacdcbc"},
35+
ans316{"acdb"},
36+
},
37+
}
38+
39+
fmt.Printf("------------------------Leetcode Problem 316------------------------\n")
40+
41+
for _, q := range qs {
42+
_, p := q.ans316, q.para316
43+
fmt.Printf("【input】:%v 【output】:%v\n", p, removeDuplicateLetters(p.one))
44+
}
45+
fmt.Printf("\n\n\n")
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package leetcode
2+
3+
// SummaryRanges define
4+
type SummaryRanges struct {
5+
intervals []Interval
6+
}
7+
8+
// Constructor352 define
9+
func Constructor352() SummaryRanges {
10+
return SummaryRanges{}
11+
}
12+
13+
// AddNum define
14+
func (sr *SummaryRanges) AddNum(val int) {
15+
if sr.intervals == nil {
16+
sr.intervals = []Interval{
17+
Interval{
18+
Start: val,
19+
End: val,
20+
},
21+
}
22+
return
23+
}
24+
25+
low, high := 0, len(sr.intervals)-1
26+
for low <= high {
27+
mid := low + (high-low)>>1
28+
if sr.intervals[mid].Start <= val && val <= sr.intervals[mid].End {
29+
return
30+
} else if val < sr.intervals[mid].Start {
31+
high = mid - 1
32+
} else {
33+
low = mid + 1
34+
}
35+
}
36+
37+
if low == 0 {
38+
if sr.intervals[0].Start-1 == val {
39+
sr.intervals[0].Start--
40+
return
41+
}
42+
ni := Interval{Start: val, End: val}
43+
sr.intervals = append(sr.intervals, ni)
44+
copy(sr.intervals[1:], sr.intervals)
45+
sr.intervals[0] = ni
46+
return
47+
}
48+
49+
if low == len(sr.intervals) {
50+
if sr.intervals[low-1].End+1 == val {
51+
sr.intervals[low-1].End++
52+
return
53+
}
54+
sr.intervals = append(sr.intervals, Interval{Start: val, End: val})
55+
return
56+
}
57+
58+
if sr.intervals[low-1].End+1 < val && val < sr.intervals[low].Start-1 {
59+
sr.intervals = append(sr.intervals, Interval{})
60+
copy(sr.intervals[low+1:], sr.intervals[low:])
61+
sr.intervals[low] = Interval{Start: val, End: val}
62+
return
63+
}
64+
65+
if sr.intervals[low-1].End == val-1 && val+1 == sr.intervals[low].Start {
66+
sr.intervals[low-1].End = sr.intervals[low].End
67+
n := len(sr.intervals)
68+
copy(sr.intervals[low:], sr.intervals[low+1:])
69+
sr.intervals = sr.intervals[:n-1]
70+
return
71+
}
72+
73+
if sr.intervals[low-1].End == val-1 {
74+
sr.intervals[low-1].End++
75+
} else {
76+
sr.intervals[low].Start--
77+
}
78+
}
79+
80+
// GetIntervals define
81+
func (sr *SummaryRanges) GetIntervals() [][]int {
82+
intervals := [][]int{}
83+
for _, interval := range sr.intervals {
84+
intervals = append(intervals, []int{interval.Start, interval.End})
85+
}
86+
return intervals
87+
}
88+
89+
/**
90+
* Your SummaryRanges object will be instantiated and called as such:
91+
* obj := Constructor();
92+
* obj.AddNum(val);
93+
* param_2 := obj.GetIntervals();
94+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
func Test_Problem352(t *testing.T) {
9+
obj := Constructor352()
10+
fmt.Printf("obj = %v\n", obj)
11+
obj.AddNum(1)
12+
fmt.Printf("Intervals = %v\n", obj.GetIntervals()) // [1,1]
13+
obj.AddNum(3)
14+
fmt.Printf("Intervals = %v\n", obj.GetIntervals()) // [1,1] [3,3]
15+
obj.AddNum(7)
16+
fmt.Printf("Intervals = %v\n", obj.GetIntervals()) // [1, 1], [3, 3], [7, 7]
17+
obj.AddNum(2)
18+
fmt.Printf("Intervals = %v\n", obj.GetIntervals()) // [1, 3], [7, 7]
19+
obj.AddNum(6)
20+
fmt.Printf("Intervals = %v\n", obj.GetIntervals()) // [1, 3], [6, 7]
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package leetcode
2+
3+
import (
4+
"math"
5+
)
6+
7+
// 解法一 二分搜索
8+
func maxSumSubmatrix(matrix [][]int, k int) int {
9+
// 转换为前缀和
10+
for i := 0; i < len(matrix); i++ {
11+
for j := 1; j < len(matrix[0]); j++ {
12+
matrix[i][j] += matrix[i][j-1]
13+
}
14+
}
15+
sum, absMax, absMaxFound := make([]int, len(matrix)), 0, false
16+
for y1 := 0; y1 < len(matrix[0]); y1++ {
17+
for y2 := y1; y2 < len(matrix[0]); y2++ {
18+
for x := 0; x < len(matrix); x++ {
19+
if y1 == 0 {
20+
sum[x] = matrix[x][y2]
21+
} else {
22+
sum[x] = matrix[x][y2] - matrix[x][y1-1]
23+
}
24+
}
25+
curMax := kadaneK(sum, k)
26+
if !absMaxFound || curMax > absMax {
27+
absMax = curMax
28+
absMaxFound = true
29+
}
30+
}
31+
}
32+
return absMax
33+
}
34+
35+
func kadaneK(a []int, k int) int {
36+
sum, sums, maxSoFar := 0, []int{}, math.MinInt32
37+
for _, v := range a {
38+
// 第一次循环会先插入 0,因为 sum 有可能等于 k
39+
sums = insertSort(sums, sum)
40+
sum += v
41+
pos := binarySearchOfKadane(sums, sum-k)
42+
if pos < len(sums) && sum-sums[pos] > maxSoFar {
43+
maxSoFar = sum - sums[pos]
44+
}
45+
}
46+
return maxSoFar
47+
}
48+
49+
func binarySearchOfKadane(a []int, v int) int {
50+
low, high := 0, len(a)
51+
for low < high {
52+
mid := low + (high-low)>>1
53+
if a[mid] < v {
54+
low = mid + 1
55+
} else {
56+
high = mid
57+
}
58+
}
59+
return low
60+
}
61+
62+
func insertSort(a []int, v int) []int {
63+
// 类似插入排序,将元素按照从小到大的顺序插入数组
64+
p := binarySearchOfKadane(a, v)
65+
a = append(a, 0)
66+
// 把 p 后面的元素全部往后移,把 p 位置空出来放 v
67+
copy(a[p+1:], a[p:len(a)-1])
68+
a[p] = v
69+
return a
70+
}
71+
72+
// 解法二 暴力解法,超时
73+
func maxSumSubmatrix1(matrix [][]int, k int) int {
74+
minNum := math.MaxInt64
75+
for row := range matrix {
76+
for col := 1; col < len(matrix[row]); col++ {
77+
if matrix[row][col] < minNum {
78+
minNum = matrix[row][col]
79+
}
80+
}
81+
}
82+
for row := range matrix {
83+
for col := 1; col < len(matrix[row]); col++ {
84+
matrix[row][col] += matrix[row][col-1]
85+
}
86+
}
87+
for i := k; ; i-- {
88+
if findSumSubmatrix(matrix, i) > 0 {
89+
return i
90+
}
91+
}
92+
}
93+
94+
func findSumSubmatrix(matrix [][]int, target int) int {
95+
m, n, res := len(matrix), len(matrix[0]), 0
96+
for i := 0; i < n; i++ {
97+
for j := i; j < n; j++ {
98+
counterMap, sum := make(map[int]int, m), 0
99+
counterMap[0] = 1 // 题目保证一定有解,所以这里初始化是 1
100+
for row := 0; row < m; row++ {
101+
if i > 0 {
102+
sum += matrix[row][j] - matrix[row][i-1]
103+
} else {
104+
sum += matrix[row][j]
105+
}
106+
res += counterMap[sum-target]
107+
counterMap[sum]++
108+
}
109+
}
110+
}
111+
return res
112+
}

0 commit comments

Comments
 (0)