u
This commit is contained in:
@@ -0,0 +1,59 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/minimum-window-substring/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
|
||||||
|
func minWindow(s string, t string) string {
|
||||||
|
if len(t) > len(s) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
need := make(map[byte]int)
|
||||||
|
for _, v := range []byte(t) {
|
||||||
|
need[v]++
|
||||||
|
}
|
||||||
|
|
||||||
|
window := make(map[byte]int)
|
||||||
|
valid := 0
|
||||||
|
left := 0
|
||||||
|
minLen := len(s) + 1
|
||||||
|
start := 0
|
||||||
|
|
||||||
|
for right := 0; right < len(s); right++ {
|
||||||
|
ch := s[right]
|
||||||
|
if _, ok := need[ch]; ok {
|
||||||
|
window[ch]++
|
||||||
|
if window[ch] == need[ch] {
|
||||||
|
valid++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for valid == len(need) {
|
||||||
|
if right-left+1 < minLen {
|
||||||
|
minLen = right - left + 1
|
||||||
|
start = left
|
||||||
|
}
|
||||||
|
|
||||||
|
d := s[left]
|
||||||
|
left++
|
||||||
|
if _, ok := need[d]; ok {
|
||||||
|
if window[d] == need[d] {
|
||||||
|
valid--
|
||||||
|
}
|
||||||
|
window[d]--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if minLen == len(s)+1 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return s[start : start+minLen]
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestS12(t *testing.T) {
|
||||||
|
println(minWindow("ADOBECODEBANC", "ABC"))
|
||||||
|
println(minWindow("a", "a"))
|
||||||
|
println(minWindow("a", "aa"))
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/
|
||||||
|
|
||||||
|
// 贪心
|
||||||
|
func maxProfit(prices []int) int {
|
||||||
|
minPrice := prices[0] // 历史最低买入价
|
||||||
|
maxProfit := 0
|
||||||
|
|
||||||
|
for i := 1; i < len(prices); i++ {
|
||||||
|
// 如果今天卖,能赚多少?
|
||||||
|
profit := prices[i] - minPrice
|
||||||
|
maxProfit = max(maxProfit, profit)
|
||||||
|
|
||||||
|
// 更新历史最低价
|
||||||
|
minPrice = min(minPrice, prices[i])
|
||||||
|
}
|
||||||
|
return maxProfit
|
||||||
|
}
|
||||||
|
|
||||||
|
// 动态规划
|
||||||
|
// dp[n][0] 第 n 天手中不持有股票时的最大利润
|
||||||
|
// dp[n][1] 第 n 天手中持有股票时的最大利润
|
||||||
|
// func maxProfit(prices []int) int {
|
||||||
|
// n := len(prices)
|
||||||
|
// if n == 0 {
|
||||||
|
// return 0
|
||||||
|
// }
|
||||||
|
|
||||||
|
// dp := make([][2]int, n)
|
||||||
|
// dp[0][0] = 0
|
||||||
|
// dp[0][1] = -prices[0]
|
||||||
|
|
||||||
|
// for i := 1; i < n; i++ {
|
||||||
|
// dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i])
|
||||||
|
// dp[i][1] = max(dp[i-1][1], -prices[i])
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return dp[n-1][0]
|
||||||
|
// }
|
||||||
|
|
||||||
|
func TestS13_1(t *testing.T) {
|
||||||
|
println(maxProfit([]int{7, 1, 5, 3, 6, 4}))
|
||||||
|
println(maxProfit([]int{7, 6, 4, 3, 1}))
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
// 爆内存
|
||||||
|
// func maxSubArray(nums []int) int {
|
||||||
|
// l := len(nums)
|
||||||
|
// msa := make([][]int, l)
|
||||||
|
// for i := range msa {
|
||||||
|
// msa[i] = make([]int, l)
|
||||||
|
// }
|
||||||
|
// res := nums[0]
|
||||||
|
// for i, v := range nums {
|
||||||
|
// msa[i][i] = v
|
||||||
|
// res = max(res, v)
|
||||||
|
// }
|
||||||
|
// for i := range l {
|
||||||
|
// for j := i + 1; j < l; j++ {
|
||||||
|
// msa[i][j] = msa[i][j-1] + nums[j]
|
||||||
|
// res = max(res, msa[i][j])
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return res
|
||||||
|
// }
|
||||||
|
|
||||||
|
func maxSubArray(nums []int) int {
|
||||||
|
dp := make([]int, len(nums))
|
||||||
|
dp[0] = nums[0]
|
||||||
|
maxSoFar := nums[0]
|
||||||
|
|
||||||
|
for i := 1; i < len(nums); i++ {
|
||||||
|
dp[i] = max(nums[i], dp[i-1]+nums[i])
|
||||||
|
maxSoFar = max(maxSoFar, dp[i])
|
||||||
|
}
|
||||||
|
return maxSoFar
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestS13(t *testing.T) {
|
||||||
|
println(maxSubArray([]int{-2, 1, -3, 4, -1, 2, 1, -5, 4}))
|
||||||
|
println(maxSubArray([]int{1}))
|
||||||
|
println(maxSubArray([]int{5, 4, -1, 7, 8}))
|
||||||
|
println(maxSubArray([]int{-2, 1}))
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import (
|
||||||
|
"cmp"
|
||||||
|
"fmt"
|
||||||
|
"slices"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/merge-intervals/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
|
||||||
|
func merge(intervals [][]int) [][]int {
|
||||||
|
if len(intervals) <= 1 {
|
||||||
|
return intervals
|
||||||
|
}
|
||||||
|
|
||||||
|
slices.SortFunc(intervals, func(a, b []int) int {
|
||||||
|
return cmp.Compare(a[0], b[0])
|
||||||
|
})
|
||||||
|
res := [][]int{}
|
||||||
|
cur := intervals[0]
|
||||||
|
for i := 1; i < len(intervals); i++ {
|
||||||
|
new := intervals[i]
|
||||||
|
// 判断是否重叠
|
||||||
|
if cur[0] <= new[0] && new[0] <= cur[1] {
|
||||||
|
cur = []int{cur[0], max(cur[1], new[1])}
|
||||||
|
} else {
|
||||||
|
res = append(res, cur)
|
||||||
|
cur = new
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res = append(res, cur)
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestS14(t *testing.T) {
|
||||||
|
fmt.Printf("%+v\n", merge([][]int{{1, 3}, {2, 6}, {8, 10}, {15, 18}}))
|
||||||
|
fmt.Printf("%+v\n", merge([][]int{{1, 4}, {4, 5}}))
|
||||||
|
fmt.Printf("%+v\n", merge([][]int{{4, 7}, {1, 4}}))
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"slices"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/rotate-array/description/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
|
||||||
|
func rotate(nums []int, k int) {
|
||||||
|
if k == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
n := len(nums)
|
||||||
|
slices.Reverse(nums)
|
||||||
|
slices.Reverse(nums[:k%n])
|
||||||
|
slices.Reverse(nums[k%n:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// func rotate(nums []int, k int) {
|
||||||
|
// n := len(nums)
|
||||||
|
// k = k % n
|
||||||
|
// if k == 0 {
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
|
// count := 0 // 已经处理了多少个元素
|
||||||
|
// for start := 0; count < n; start++ {
|
||||||
|
// current := start
|
||||||
|
// prev := nums[start] // 暂存起点元素
|
||||||
|
|
||||||
|
// // 沿着环跳动
|
||||||
|
// for {
|
||||||
|
// next := (current + k) % n
|
||||||
|
// // 把 prev 放到 next 位置,同时保存 next 原来的值作为新的 prev
|
||||||
|
// nums[next], prev = prev, nums[next]
|
||||||
|
// current = next
|
||||||
|
// count++
|
||||||
|
|
||||||
|
// if current == start {
|
||||||
|
// break // 回到起点,这条环走完了
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
func TestS15(t *testing.T) {
|
||||||
|
input := []int{1, 2, 3, 4, 5, 6, 7}
|
||||||
|
rotate(input, 3)
|
||||||
|
fmt.Printf("%+v\n", input)
|
||||||
|
input = []int{-1, -100, 3, 99}
|
||||||
|
rotate(input, 2)
|
||||||
|
fmt.Printf("%+v\n", input)
|
||||||
|
input = []int{-1}
|
||||||
|
rotate(input, 2)
|
||||||
|
fmt.Printf("%+v\n", input)
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/product-of-array-except-self/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
|
||||||
|
// func productExceptSelf(nums []int) []int {
|
||||||
|
// left := make([]int, len(nums))
|
||||||
|
// right := make([]int, len(nums))
|
||||||
|
// left[0] = nums[0]
|
||||||
|
// right[len(nums)-1] = nums[len(nums)-1]
|
||||||
|
// for i := 1; i < len(nums); i++ {
|
||||||
|
// left[i] = left[i-1] * nums[i]
|
||||||
|
// }
|
||||||
|
// for i := len(nums) - 2; i >= 0; i-- {
|
||||||
|
// right[i] = right[i+1] * nums[i]
|
||||||
|
// }
|
||||||
|
// res := []int{}
|
||||||
|
// for i := range nums {
|
||||||
|
// if i == 0 {
|
||||||
|
// res = append(res, right[1])
|
||||||
|
// } else if i == len(nums)-1 {
|
||||||
|
// res = append(res, left[len(nums)-2])
|
||||||
|
// } else {
|
||||||
|
// res = append(res, left[i-1]*right[i+1])
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return res
|
||||||
|
// }
|
||||||
|
|
||||||
|
func productExceptSelf(nums []int) []int {
|
||||||
|
n := len(nums)
|
||||||
|
answer := make([]int, n)
|
||||||
|
|
||||||
|
// 第一遍:计算左边乘积,存入 answer
|
||||||
|
answer[0] = 1
|
||||||
|
for i := 1; i < n; i++ {
|
||||||
|
answer[i] = answer[i-1] * nums[i-1]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 第二遍:从右向左,用 R 维护右边乘积
|
||||||
|
R := 1
|
||||||
|
for i := n - 1; i >= 0; i-- {
|
||||||
|
answer[i] = answer[i] * R // 左边积 × 右边积
|
||||||
|
R = R * nums[i] // 更新右边积
|
||||||
|
}
|
||||||
|
|
||||||
|
return answer
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestS16(t *testing.T) {
|
||||||
|
fmt.Printf("%+v", productExceptSelf([]int{1, 2, 3, 4}))
|
||||||
|
fmt.Printf("%+v", productExceptSelf([]int{-1, 1, 0, -3, 3}))
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/first-missing-positive/description/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
|
||||||
|
func firstMissingPositive(nums []int) int {
|
||||||
|
n := len(nums)
|
||||||
|
for i := range nums {
|
||||||
|
for nums[i] >= 1 && nums[i] <= n && nums[i] != i+1 {
|
||||||
|
if nums[i] != nums[nums[i]-1] { // 关键条件,否则会死循环 [1, 1]
|
||||||
|
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i, v := range nums {
|
||||||
|
if v != i+1 {
|
||||||
|
return i + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestS17(t *testing.T) {
|
||||||
|
// println(firstMissingPositive([]int{1, 2, 0}))
|
||||||
|
// println(firstMissingPositive([]int{3, 4, -1, 1}))
|
||||||
|
// println(firstMissingPositive([]int{7, 8, 9, 11, 12}))
|
||||||
|
println(firstMissingPositive([]int{1, 1}))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user