diff --git a/子串/最小覆盖子串/main.go b/子串/最小覆盖子串/main.go new file mode 100644 index 0000000..b99a9e2 --- /dev/null +++ b/子串/最小覆盖子串/main.go @@ -0,0 +1,89 @@ +package main + +import "fmt" + +func main() { + fmt.Println(minWindow("baABabbb", "A")) +} + +func minWindow(s string, t string) string { + return "" +} + +//func minWindow(s string, t string) string { +// if len(s) < len(t) { +// return "" +// } +// //fmt.Println("1") +// minstr := "" +// numstr := make([]int, 256) +// num := 0 +// for _, ch := range t { +// +// //fmt.Println("ch:", ch, 'a') +// numstr[ch]++ +// num++ +// } +// +// for i := 0; i < len(s); i++ { +// //fmt.Println("1") +// if int(s[i]) >= len(numstr) { +// //fmt.Println("2") +// continue +// } +// //fmt.Println("------当前i,", i) +// //fmt.Println("numstr[s[i]]", numstr[s[i]]) +// if numstr[s[i]] > 0 { +// tmpnum := num +// tmpstr := make([]int, 256) +// copy(tmpstr, numstr) +// tmpstr[s[i]] -= 1 +// tmpnum-- +// p := i + 1 +// for p < len(s) { +// if tmpnum == 0 { +// //fmt.Println("退出循环") +// break +// } +// //fmt.Println("当前p:", p, "指向:", string(s[p])) +// //fmt.Println("tmpstr", tmpstr) +// if int(s[p]) >= len(tmpstr) { +// p++ +// //fmt.Println("跳过") +// continue +// } +// +// if tmpstr[s[p]] > 0 { +// tmpstr[s[p]] -= 1 +// tmpnum-- +// +// //fmt.Println("修改后的tmpstr", tmpstr) +// +// } +// //fmt.Println("1") +// p++ +// } +// //fmt.Println("本次循环中tmpnum为:", tmpnum) +// if tmpnum == 0 { +// //fmt.Println("匹配到目标") +// if len(minstr) == 0 { +// minstr = s[i:p] +// } else { +// if (p - i) < len(minstr) { +// minstr = s[i:p] +// } +// } +// +// } else { +// continue +// +// } +// +// } else { +// continue +// } +// //fmt.Println("------退出第", i, "次循环,minstr为:", minstr) +// } +// +// return minstr +//} diff --git a/子串/滑动窗口最大值/main.go b/子串/滑动窗口最大值/main.go index a705e55..3eae8b4 100644 --- a/子串/滑动窗口最大值/main.go +++ b/子串/滑动窗口最大值/main.go @@ -1,58 +1,51 @@ package main -import ( - "fmt" - "sort" -) +import "fmt" func main() { - var a []int - a[0] = 1 - fmt.Println(a[1]) - //fmt.Println(maxSlidingWindow([]int{1, 3, -1, -3, 5, 3, 6, 7}, 3)) + fmt.Println(maxSlidingWindow([]int{7, 2, 4}, 2)) } - func maxSlidingWindow(nums []int, k int) []int { - queue := make([]int, k) - result := make([]int, 0) - for i := 0; i < k; i++ { - queue[i] = nums[i] + if k > len(nums) { + return []int(nil) } - maxnum := 0 - for i := 0; i < len(nums)-k+1; i++ { - if i == 0 { - queuetmp := make([]int, len(queue)) - copy(queuetmp, queue) // 深拷贝 - sort.Ints(queuetmp) - maxnum = queuetmp[k-1] - result = append(result, queuetmp[k-1]) + numlist := make([]int, 0, k) + result := make([]int, 0) - //fmt.Println("result:", result) + for i := 0; i < len(nums); i++ { + if len(numlist) == 0 { + numlist = append(numlist, i) + if i >= k-1 { + result = append(result, nums[numlist[0]]) + } continue } - fmt.Println("queue分割前:", queue) - queueA := queue[1:] - //fmt.Println("queueA", queueA) - queueA = append(queueA, nums[i+k-1]) - queue = queueA - fmt.Println("max", maxnum) - fmt.Println("当前右边界:", nums[i+k-1]) - if nums[i+k-1] >= maxnum { - maxnum = nums[i+k-1] - result = append(result, nums[i+k-1]) - } else { - queuetmp := make([]int, len(queue)) - copy(queuetmp, queue) // 深拷贝 - sort.Ints(queuetmp) - result = append(result, queuetmp[k-1]) + if numlist[0] <= i-k { + numlist = numlist[1:] + } + p := len(numlist) - 1 + //fmt.Println(numlist) + for { + if len(numlist) == 0 || p < 0 { + break + } + if nums[numlist[p]] < nums[i] { + p-- + } else { + break + } + } + numlist = numlist[:p+1] + if len(numlist) < k { + numlist = append(numlist, i) + } else { + numlist = append(numlist[1:], i) + } + if i >= k-1 { + result = append(result, nums[numlist[0]]) } - // - - //fmt.Println("queueA2", queueA) - //fmt.Println("queueA", queue) - - fmt.Println("result:", result) } + //fmt.Println("result", result) return result } @@ -144,6 +137,50 @@ func maxSlidingWindow(nums []int, k int) []int { // return result //} +//func maxSlidingWindow(nums []int, k int) []int { +// queue := make([]int, k) +// result := make([]int, 0) +// for i := 0; i < k; i++ { +// queue[i] = nums[i] +// } +// maxnum := 0 +// for i := 0; i < len(nums)-k+1; i++ { +// if i == 0 { +// queuetmp := make([]int, len(queue)) +// copy(queuetmp, queue) // 深拷贝 +// sort.Ints(queuetmp) +// maxnum = queuetmp[k-1] +// result = append(result, queuetmp[k-1]) +// +// //fmt.Println("result:", result) +// continue +// } +// fmt.Println("queue分割前:", queue) +// queueA := queue[1:] +// //fmt.Println("queueA", queueA) +// queueA = append(queueA, nums[i+k-1]) +// queue = queueA +// fmt.Println("max", maxnum) +// fmt.Println("当前右边界:", nums[i+k-1]) +// if nums[i+k-1] >= maxnum { +// maxnum = nums[i+k-1] +// result = append(result, nums[i+k-1]) +// } else { +// queuetmp := make([]int, len(queue)) +// copy(queuetmp, queue) // 深拷贝 +// sort.Ints(queuetmp) +// result = append(result, queuetmp[k-1]) +// } +// // +// +// //fmt.Println("queueA2", queueA) +// //fmt.Println("queueA", queue) +// +// fmt.Println("result:", result) +// } +// return result +//} + //func maxSlidingWindow(nums []int, k int) []int { // result := make([]int, 0) // nowmax := 0 diff --git a/普通数组/缺失的第一个正数/main.go b/普通数组/缺失的第一个正数/main.go new file mode 100644 index 0000000..fc4705d --- /dev/null +++ b/普通数组/缺失的第一个正数/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "fmt" + "sort" +) + +func main() { + + fmt.Println(firstMissingPositive([]int{1000, -1})) +} +func firstMissingPositive(nums []int) int { + if len(nums) == 1 { + if nums[0] == 1 { + return 2 + } + return 1 + } + numlist := make([]int, 0) + for i := 0; i < len(nums); i++ { + if nums[i] > 0 { + numlist = append(numlist, nums[i]) + } + } + + sort.Ints(numlist) + fmt.Println(numlist) + slow, fast := 0, 1 + if len(numlist) == 0 { + return 1 + } + if numlist[0] != 1 { + return 1 + } + for slow <= fast && slow <= len(numlist)-1 && fast <= len(numlist)-1 { + if numlist[fast] == numlist[slow]+1 || numlist[fast] == numlist[slow] { + fmt.Println("相等") + fmt.Println("当前", numlist[fast], numlist[slow]+1) + slow++ + fast = slow + 1 + + continue + } else { + break + } + + } + return numlist[slow] + 1 +} diff --git a/普通数组/除自身以外数组的乘积/main.go b/普通数组/除自身以外数组的乘积/main.go new file mode 100644 index 0000000..59ccc33 --- /dev/null +++ b/普通数组/除自身以外数组的乘积/main.go @@ -0,0 +1,52 @@ +package main + +import "fmt" + +func main() { + + fmt.Println(productExceptSelf([]int{1, 2, 3, 4})) +} + +func productExceptSelf(nums []int) []int { + before := make([]int, len(nums)) + after := make([]int, len(nums)) + result := make([]int, len(nums)) + value1 := 1 + value2 := 1 + for i := 0; i < len(nums); i++ { + + if i == 0 { + before[i] = 0 + continue + } + + //fmt.Println("value:", value1) + value1 = nums[i-1] * value1 + //fmt.Println("nums[i-1]:", nums[i-1]) + + before[i] = value1 + } + for i := len(nums) - 1; i >= 0; i-- { + //fmt.Println("循环到:", nums[i]) + if i == len(nums)-1 { + after[i] = 0 + continue + } + value2 *= nums[i+1] + after[i] = value2 + } + for i := 0; i < len(nums); i++ { + if i == 0 { + result[i] = after[i] + continue + } + if i == len(nums)-1 { + result[i] = before[i] + continue + } + result[i] = before[i] * after[i] + } + //fmt.Println(before) + //fmt.Println(after) + return result +} diff --git a/矩阵/矩阵置零/main.go b/矩阵/矩阵置零/main.go new file mode 100644 index 0000000..6b5d4ab --- /dev/null +++ b/矩阵/矩阵置零/main.go @@ -0,0 +1,9 @@ +package main + +func main() { + +} + +func setZeroes(matrix [][]int) { + +}