one question per day
2022-12-29
go
// 2032: https://leetcode.cn/problems/two-out-of-three/
// 9:10 - 9:16
func twoOutOfThree(nums1 []int, nums2 []int, nums3 []int) []int {
res := []int{}
resMap := map[int]bool{}
countMap1 := map[int]bool{}
for _, v := range nums1 {
countMap1[v] = true
}
countMap2 := map[int]bool{}
for _, v := range nums2 {
countMap2[v] = true
}
countMap3 := map[int]bool{}
for _, v := range nums3 {
countMap3[v] = true
}
for _, v := range nums1 {
if countMap2[v] || countMap3[v] {
resMap[v] = true
}
}
for _, v := range nums2 {
if countMap1[v] || countMap3[v] {
resMap[v] = true
}
}
for key := range resMap {
res = append(res, key)
}
return res
}
func main() {
nums1 := []int{1, 1, 3, 2}
nums2 := []int{2, 3}
nums3 := []int{3}
fmt.Println(twoOutOfThree(nums1, nums2, nums3))
}2022-12-28
go
package main
import "fmt"
// 1750: https://leetcode.cn/problems/minimum-length-of-string-after-deleting-similar-ends/
// 9:36 - 9:44
func minimumLength(s string) int {
left, right := 0, len(s)-1
for left < right {
if s[left] != s[right] {
return right - left + 1
}
leftCur := left
for leftCur+1 < right && s[leftCur+1] == s[left] {
leftCur++
}
rightCur := right
for rightCur-1 > left && s[rightCur-1] == s[right] {
rightCur--
}
if leftCur < rightCur {
left = leftCur + 1
right = rightCur - 1
} else {
return 0
}
}
return right - left + 1
}
func main() {
// s := "cabaabac"
s := "ca"
fmt.Println(minimumLength(s))
}2022-12-16
go
package main
import "fmt"
// 1785: https://leetcode.cn/problems/minimum-elements-to-add-to-form-a-given-sum/
// 9:39- 09:46
func minElements(nums []int, limit int, goal int) int {
sum := 0
for _, v := range nums {
sum += v
}
gap := goal - sum
if gap < 0 {
gap = -gap
}
if gap == 0 {
return 0
}
// fmt.Println(gap, gap/limit)
res := gap / limit
if gap%limit > 0 {
res += 1
}
return res
}
func main() {
nums, limit, goal := []int{1, -1, 1}, 3, -4
fmt.Println(minElements(nums, limit, goal))
}2022-12-15
go
package main
import (
"fmt"
"strconv"
"strings"
)
// 1945: https://leetcode.cn/problems/sum-of-digits-of-string-after-convert/
// 09:37- 09:53
func getLucky(s string, k int) int {
t := []string{}
for _, v := range s {
t = append(t, strconv.Itoa(int(v-'a'+1)))
}
curStr := strings.Join(t[:], "")
for i := 1; i <= k && len(curStr) > 1; i++ {
sum := 0
for _, c := range curStr {
sum += int(c - '0')
}
curStr = strconv.Itoa(sum)
}
// fmt.Println(curStr)
ans, _ := strconv.Atoi(curStr)
return ans
}
func main() {
s, k := "iiii", 1
ans := getLucky(s, k)
fmt.Printf("%v", ans)
}2022-12-13
go
package main
import "fmt"
// 1832: https://leetcode.cn/problems/check-if-the-sentence-is-pangram/
// 13:38 - 13:42
func checkIfPangram(sentence string) bool {
countMap := map[rune]bool{}
for _, v := range sentence {
countMap[v] = true
}
return len(countMap) == 26
}
func main() {
// sentence := "thequickbrownfoxjumpsoverthelazydog"
sentence := "leetcode"
fmt.Println(checkIfPangram(sentence))
// fmt.Println(ans)
}2022-12-08
go
package main;
func squareIsWhite(coordinates string) bool {
d1 := byte(coordinates[0]) - byte('a')
d2 := byte(coordinates[1]) - byte('1')
// fmt.Println(d1, d2)
return (d1%2 == 0 && d2%2 == 1) || (d1%2 == 1 && d2%2 == 0)
}
func main() {
coordinates := "a1"
ans := squareIsWhite(coordinates)
fmt.Printf("%v", ans)
}2022-12-07
- https://leetcode.cn/problems/equal-sum-arrays-with-minimum-number-of-operations/description/;
- 贪心,哈希计数;
go
package main
// 1775: https://leetcode.cn/problems/equal-sum-arrays-with-minimum-number-of-operations/
// 09:42- 09:54;
func minOperations(nums1 []int, nums2 []int) int {
if 6*len(nums1) < len(nums2) || 6*len(nums2) < len(nums1) {
return -1
}
d := 0
for _, x := range nums2 {
d += x
}
for _, x := range nums1 {
d -= x
}
if d < 0 {
d = -d
nums1, nums2 = nums2, nums1
}
cnt := [6]int{}
for _, x := range nums1 {
cnt[6-x]++
}
for _, x := range nums2 {
cnt[x-1]++
}
ans := 0
for i := 5; ; i-- {
if i*cnt[i] >= d {
return ans + (d+i-1)/i
}
ans += cnt[i]
d -= i * cnt[i]
}
// return ans
return ans
}
func main() {
nums1 := []int{1, 2, 3, 4, 5, 6}
nums2 := []int{1, 1, 2, 2, 2, 2}
fmt.Println(minOperations(nums1, nums2))
// fmt.Println(ans)
}2022-11-29
go
package main
import "fmt"
func minOperations(s string) int {
res := len(s)
arr := []byte{'0', '1'}
for i := 0; i < 2; i++ {
temp := 0
for j := 0; j < len(s); j++ {
if j%2 == 0 && s[j] == arr[i%2] {
temp++
}
if j%2 == 1 && s[j] == arr[(i+1)%2] {
temp++
}
}
if temp < res {
res = temp
}
}
return res
}
func main() {
s := "0100"
// s := "1111"
ans := minOperations(s)
fmt.Printf("%v", ans)
}2022-11-28
go
package main
import "fmt"
// 9:33- 10:02
func largestSumOfAverages(nums []int, k int) float64 {
res := float64(-1)
targetSum := make([]int, len(nums))
for i, v := range nums {
if i == 0 {
targetSum[0] = v
} else {
targetSum[i] = v + targetSum[i-1]
}
}
var getScopeSum func(left, right int) int
getScopeSum = func(left, right int) int {
return targetSum[right] - targetSum[left] + nums[left]
}
var getScopeAverage func(left, right int) float64
getScopeAverage = func(left, right int) float64 {
// fmt.Println(left, right, sum, right-left+1, sum/(float64((right - left + 1))))
return float64(getScopeSum(left, right)) / (float64((right - left + 1)))
}
var dfs func(index, count int, sum float64)
dfs = func(index, count int, sum float64) {
if count == k && index == len(nums) {
res = max(res, sum)
return
} else if index >= len(nums) {
return
} else if count >= k {
return
}
if count == k-1 {
tempSum := sum + getScopeAverage(index, len(nums)-1)
dfs(len(nums), k, tempSum)
} else {
for i := index; i < len(nums)-1; i++ {
dfs(i+1, count+1, sum+getScopeAverage(index, i))
}
}
}
dfs(0, 0, 0)
return res
}
func max(a, b float64) float64 {
if a < b {
return b
}
return a
}
func main() {
// nums := []int{9, 1, 2, 3, 9}
// k := 3
// nums := []int{1, 2, 3, 4, 5, 6, 7}
// k := 4
nums := []int{7769, 5973, 2106, 45, 9869, 1196, 8869}
k := 1
fmt.Println(largestSumOfAverages(nums, k))
// fmt.Println(ans)
}2022-11-27
go
package main
import "fmt"
func check(nums []int) bool {
curIndex := -1
for i := range nums {
if i+1 < len(nums) && nums[i] > nums[i+1] {
curIndex = i + 1
break
}
}
if curIndex == -1 {
return true
}
curNums := []int{}
curNums = append(curNums, nums[curIndex:]...)
curNums = append(curNums, nums[0:curIndex]...)
for i := range curNums {
if i+1 < len(curNums) && curNums[i] > curNums[i+1] {
return false
}
}
return true
}
func main() {
nums := []int{3, 4, 5, 1, 2}
// nums := []int{2, 1, 3, 4}
// nums := []int{1, 3, 4}
// nums := []int{2, 4, 1, 3}
fmt.Println(check(nums))
}2022-11-25
go
package main
import "fmt"
type Res struct {
char byte
count int
}
func getWordCount(s string) []Res {
res := []Res{}
for i := 0; i < len(s); {
tempRes := Res{
char: s[i],
count: 1,
}
j := i + 1
for ; j < len(s); j++ {
if s[j] != tempRes.char {
break
}
tempRes.count++
}
res = append(res, tempRes)
i = j
}
return res
}
func judgeTwoStruct(res1 []Res, res2 []Res) bool {
if len(res1) != len(res2) {
return false
}
for i := range res1 {
c2 := res2[i].count
c1 := res1[i].count
// fmt.Println(c1, c2)
if res1[i].char != res2[i].char {
return false
}
if !((c1 == c2) || (c2 < c1 && c1 >= 3)) {
// fmt.Println("----", c2, c1, res2)
return false
}
}
return true
}
func expressiveWords(s string, words []string) int {
initialStruc := getWordCount(s)
// fmt.Println(initialStruc)
res := 0
for i := range words {
tempStruc := getWordCount(words[i])
// fmt.Println(tempStruc)
if judgeTwoStruct(initialStruc, tempStruc) {
res++
}
}
return res
}
func main() {
// S := "heeellooo"
// fmt.Printf("%v", getWordCount(S))
// words := []string{"hello", "hi", "helo"}
S := "dddiiiinnssssssoooo"
words := []string{"dinnssoo", "ddinso", "ddiinnso", "ddiinnssoo", "ddiinso", "dinsoo", "ddiinsso", "dinssoo", "dinso"}
ans := expressiveWords(S, words)
fmt.Printf("%v", ans)
}2022-11-24
go
package main
import "fmt"
// 9:05- 9:29
func numSubarrayBoundedMax(nums []int, left int, right int) int {
res := 0
last2, last1 := -1, -1
for i, x := range nums {
if left <= x && x <= right {
last1 = i
} else if x > right {
last2 = i
last1 = -1
}
if last1 != -1 {
res += last1 - last2
}
}
return res
}
func main() {
// nums := []int{2, 1, 4, 3}
// left := 2
// right := 3
nums := []int{2, 9, 2, 5, 6}
left := 2
right := 8
ans := numSubarrayBoundedMax(nums, left, right)
fmt.Printf("%v", ans)
}2022-11-23
go
package main
import "fmt"
// 9:30- 9:36
func getNumBitSum(target int) int {
res := 0
cur := target
for cur > 0 {
res += cur % 10
cur = cur / 10
}
return res
}
func countBalls(lowLimit int, highLimit int) int {
max := 0
countMap := map[int]int{}
for i := lowLimit; i <= highLimit; i++ {
temp := getNumBitSum(i)
countMap[temp]++
if countMap[temp] > max {
max = countMap[temp]
}
}
return max
}
func main() {
// lowLimit := 1
// highLimit := 10
lowLimit := 5
highLimit := 15
ans := countBalls(lowLimit, highLimit)
fmt.Printf("%v", ans)
}2022-11-22
go
package main
import "fmt"
func min(a, b int) int {
if a < b {
return a
}
return b
}
func gcd(a, b int) int {
if b != 0 {
return gcd(b, a%b)
}
return a
}
const mod int = 1e9 + 7
func nthMagicalNumber(n int, a int, b int) int {
l := min(a, b)
r := n * min(a, b)
c := a / gcd(a, b) * b
for l <= r {
mid := (l + r) / 2
cnt := mid/a + mid/b - mid/c
if cnt >= n {
r = mid - 1
} else {
l = mid + 1
}
}
return (r + 1) % mod
}
func main() {
ans := nthMagicalNumber(1, 2, 3)
fmt.Printf("%v", ans)
}2022-11-21
go
package main
import "fmt"
func soupServings(n int) float64 {
n = (n + 24) / 25
if n >= 179 {
return 1
}
dp := make([][]float64, n+1)
for i := range dp {
dp[i] = make([]float64, n+1)
}
dp[0][0] = 0.5
for i := 1; i <= n; i++ {
dp[0][i] = 1
}
for i := 1; i <= n; i++ {
for j := 1; j <= n; j++ {
dp[i][j] = (dp[max(0, i-4)][j] + dp[max(0, i-3)][max(0, j-1)] + dp[max(0, i-2)][max(0, j-2)] + dp[max(0, i-1)][max(0, j-3)]) / 4
}
}
return dp[n][n]
}
func max(a, b int) int {
if b > a {
return b
}
return a
}
func main() {
fmt.Println(soupServings(50))
}2022-09-07
go
package main
import (
"fmt"
"strings"
)
// 1592: https://leetcode.cn/problems/rearrange-spaces-between-words/
// 10:50 - 10:56;
func reorderSpaces(text string) string {
words := strings.Fields(text)
spaceNum := strings.Count(text, " ")
lw := len(words) - 1
if lw == 0 {
return words[0] + strings.Repeat(" ", spaceNum)
}
return strings.Join(words, strings.Repeat(" ", spaceNum/lw)) + strings.Repeat(" ", spaceNum%lw)
}
func main() {
text := " this is a sentence "
fmt.Println(reorderSpaces(text))
// fmt.Println(ans)
}2022-08-05
go
package main
import "fmt"
// 2090: https://leetcode.cn/problems/k-radius-subarray-averages/
// 10:58 - 11:10;
func getAverages(nums []int, k int) []int {
if k == 0 {
return nums
}
if len(nums) < 2*k+1 {
ans := []int{}
for i := 0; i < len(nums); i++ {
ans = append(ans, -1)
}
return ans
}
ans := []int{}
currentSum := 0
for i := 0; i < 2*k+1; i++ {
currentSum += nums[i]
}
for i := 0; i < len(nums); i++ {
if i < k {
ans = append(ans, -1)
} else if i == k {
ans = append(ans, currentSum/(2*k+1))
} else if len(nums)-i > k {
currentSum = currentSum + nums[i+k] - nums[i-k-1]
ans = append(ans, currentSum/(2*k+1))
} else {
ans = append(ans, -1)
}
}
return ans
}
func main() {
nums := []int{7, 4, 3, 9, 1, 8, 5, 2, 6}
k := 3
// nums := []int{100000}
// k := 0
// nums := []int{8}
// k := 1000000
fmt.Println(getAverages(nums, k))
// fmt.Println(ans)
}2022-08-04
go
package main
import (
"fmt"
"sort"
)
// 1403:https://leetcode.cn/problems/minimum-subsequence-in-non-increasing-order/
// 12:03 - 12:08
func minSubsequence(nums []int) []int {
tempNums := append([]int{}, nums...)
sort.Ints(tempNums)
sum := 0
for _, v := range tempNums {
sum += v
}
ans := []int{}
tempCount := 0
for i := len(tempNums) - 1; i >= 0; i-- {
if tempCount > sum-tempCount {
break
}
ans = append(ans, tempNums[i])
tempCount += tempNums[i]
}
// fmt.Println(tempNums)
return ans
}
func main() {
// nums := []int{4, 3, 10, 9, 8}
// nums := []int{4, 4, 7, 6, 7}
nums := []int{6}
fmt.Println(minSubsequence(nums))
// fmt.Println(ans)
}2022-08-03
go
package main
// 1981: https://leetcode.cn/problems/minimize-the-difference-between-target-and-chosen-elements/
// 9:39 - 9: 52
func minimizeTheDifference(mat [][]int, target int) int {
if len(mat) == 0 {
return target
}
ans := 1000000
row := len(mat)
col := len(mat[0])
var dfs func(index int, current int)
dfs = func(index int, current int) {
if current > target && abs(current-target) > ans {
return
}
if index == row {
// fmt.Println(index, current, ans)
if abs(current-target) < ans {
ans = abs(current - target)
}
return
}
for i := 0; i < col; i++ {
dfs(index+1, current+mat[index][i])
}
}
dfs(0, 0)
return ans
}
func abs(a int) int {
if a < 0 {
return -a
}
return a
}2022-07-29
go
package main
import (
"fmt"
"math"
)
// 593: https://leetcode.cn/problems/valid-square/
// 9:21 - 9:38
func validSquare(p1 []int, p2 []int, p3 []int, p4 []int) bool {
var getTwoPointRatio func([]int, []int) float64
getTwoPointRatio = func(p1 []int, p2 []int) float64 {
if p1[0] == p2[0] {
return -1
}
return float64(p1[1]-p2[1]) / float64(p1[0]-p2[0])
}
var getTwoPointDistance func([]int, []int) float64
getTwoPointDistance = func(p1 []int, p2 []int) float64 {
return math.Sqrt(float64(p1[0]-p2[0])*float64(p1[0]-p2[0]) + float64(p1[1]-p2[1])*float64(p1[1]-p2[1]))
}
// fmt.Println(getTwoPointRatio(p1, p2), getTwoPointRatio(p3, p4), getTwoPointRatio(p1, p3), getTwoPointRatio(p2, p4))
// p1 和 p2 是邻边;
if getTwoPointRatio(p1, p2) == getTwoPointRatio(p3, p4) && getTwoPointDistance(p1, p2) == getTwoPointDistance(p3, p4) {
edge := getTwoPointDistance(p1, p2)
possible1 := getTwoPointDistance(p1, p3)
possible2 := getTwoPointDistance(p1, p4)
if edge == possible1 || edge == possible2 {
return true
}
}
// p1 和 p3 是邻边;
if getTwoPointRatio(p1, p3) == getTwoPointRatio(p2, p4) && getTwoPointDistance(p1, p3) == getTwoPointDistance(p2, p4) {
edge := getTwoPointDistance(p1, p3)
possible1 := getTwoPointDistance(p1, p2)
possible2 := getTwoPointDistance(p1, p4)
if edge == possible1 || edge == possible2 {
return true
}
}
return false
}
func main() {
p1 := []int{0, 0}
p2 := []int{1, 1}
p3 := []int{1, 0}
p4 := []int{0, 1}
// two
// p1 := []int{0, 0}
// p2 := []int{1, 1}
// p3 := []int{1, 0}
// p4 := []int{0, 12}
// // three
// p1 := []int{1, 0}
// p2 := []int{-1, 0}
// p3 := []int{0, 1}
// p4 := []int{0, -1}
// three
// p1 := []int{0, 0}
// p2 := []int{5, 0}
// p3 := []int{5, 4}
// p4 := []int{0, 4}
fmt.Println(validSquare(p1, p2, p3, p4))
// fmt.Println(ans)
}2022-07-28
go
package main
import (
"fmt"
"sort"
)
// 1331: https://leetcode.cn/problems/rank-transform-of-an-array/
// 9:37 - 9:46
func arrayRankTransform(arr []int) []int {
tempArr := []int{}
tempMap := map[int]int{}
for _, v := range arr {
if _, ok := tempMap[v]; !ok {
tempMap[v] = 1
tempArr = append(tempArr, v)
}
}
// fmt.Println(tempArr)
sort.Slice(tempArr, func(a, b int) bool {
return tempArr[a] < tempArr[b]
})
// fmt.Println(tempArr)
for i, v := range tempArr {
tempMap[v] = i + 1
}
result := []int{}
for _, v := range arr {
result = append(result, tempMap[v])
}
return result
// return []int{1}
}
func main() {
arr := []int{40, 10, 20, 30, 10}
fmt.Println(arrayRankTransform(arr))
// fmt.Println(ans)
}2022-07-27
go
package main
import (
"fmt"
"unicode"
)
// 592: https://leetcode.cn/problems/fraction-addition-and-subtraction/
// 9:32 - 9:49
func fractionAddition(expression string) string {
denominator, numberator := 0, 1
for i, n := 0, len(expression); i < n; {
// 读取分子
denominator1, sign := 0, 1
if expression[i] == '-' || expression[i] == '+' {
if expression[i] == '-' {
sign = -1
}
i++
}
for i < n && unicode.IsDigit(rune(expression[i])) {
denominator1 = denominator1*10 + int(expression[i]-'0')
i++
}
denominator1 = sign * denominator1
// 读取分母
i++
numberator1 := 0
for i < n && unicode.IsDigit(rune(expression[i])) {
numberator1 = numberator1*10 + int(expression[i]-'0')
i++
}
denominator = denominator*numberator1 + denominator1*numberator
numberator = numberator * numberator1
}
if denominator == 0 {
return "0/1"
}
g := gcd(abs(denominator), numberator)
// fmt.Println(denominator, numberator, g)
return fmt.Sprintf("%d/%d", denominator/g, numberator/g)
// return ""
}
func gcd(a, b int) int {
if a >= b {
a, b = b, a
}
if a != 0 {
a, b = b%a, a
}
return b
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
func main() {
// expression := "-1/2+1/2"
// expression := "-1/2+1/2+1/3"
// expression := "1/3-1/2"
expression := "5/3+1/3"
ans := fractionAddition(expression)
fmt.Println(ans)
}2022-07-18
go
package main
import "fmt"
// 707: https://leetcode.cn/problems/design-linked-list/
// 10:24 - 10:48
type Node struct {
val int
next *Node
}
type MyLinkedList struct {
head *Node
size int
}
func Constructor() MyLinkedList {
dummyHead := &Node{
val: -1,
next: nil,
}
return MyLinkedList{head: dummyHead, size: 0}
}
func (this *MyLinkedList) Get(index int) int {
if index < 0 || index >= (this.size-1) {
return -1
}
var cur *Node = this.head
for i := 0; i <= index; i++ {
cur = cur.next
}
return cur.val
}
func (this *MyLinkedList) AddAtHead(val int) {
newNode := &Node{val: val, next: nil}
newNode.next = this.head.next
this.head.next = newNode
this.size++
}
func (this *MyLinkedList) AddAtTail(val int) {
newNode := &Node{val: val, next: nil}
cur := this.head
for cur.next != nil {
cur = cur.next
}
cur.next = newNode
this.size++
}
func (this *MyLinkedList) AddAtIndex(index int, val int) {
if index > this.size {
return
}
if index == this.size {
this.AddAtTail(val)
return
}
newNode := &Node{val: val, next: nil}
cur := this.head
for i := 0; i < index; i++ {
cur = cur.next
}
newNode.next = cur.next
cur.next = newNode
this.size++
}
func (this *MyLinkedList) DeleteAtIndex(index int) {
if index > this.size-1 || index < 0 {
return
}
cur := this.head
for i := 0; i < index; i++ {
cur = cur.next
}
cur.next = cur.next.next
this.size--
}
func main() {
obj := Constructor()
obj.AddAtHead(1)
obj.AddAtTail(3)
obj.AddAtIndex(1, 2)
fmt.Println(obj.head, obj.head.next, obj.head.next.next, obj.head.next.next.next)
fmt.Println(obj.Get(1))
}2022-07-01
go
package main
import "fmt"
// 1252: https://leetcode.cn/problems/cells-with-odd-values-in-a-matrix/
// 10:38- 10:48
func oddCells(m int, n int, indices [][]int) int {
xMap := map[int]int{}
yMap := map[int]int{}
for _, v := range indices {
xMap[v[0]]++
yMap[v[1]]++
}
// fmt.Println(xMap, yMap)
ans := 0
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
count := xMap[i] + yMap[j]
if count%2 == 1 {
ans++
}
}
}
return ans
}
func main() {
m := 2
n := 3
indices := [][]int{{0, 1}, {1, 1}}
ans := oddCells(m, n, indices)
fmt.Println(ans)
// fmt.Println(ans)
}2022-06-22
go
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// 513: https://leetcode.cn/problems/find-bottom-left-tree-value/
// 11:35 - 11:40
func findBottomLeftValue(root *TreeNode) int {
if root == nil {
return 0
}
queue := []*TreeNode{root}
ans := 0
for len(queue) > 0 {
tempQueue := []*TreeNode{}
ans = queue[0].Val
for _, node := range queue {
if node.Left != nil {
tempQueue = append(tempQueue, node.Left)
}
if node.Right != nil {
tempQueue = append(tempQueue, node.Right)
}
}
queue = tempQueue
}
return ans
}
func main() {
root := &TreeNode{
Val: 1,
Left: &TreeNode{Val: 2},
Right: &TreeNode{Val: 3},
}
ans := findBottomLeftValue(root)
fmt.Println(ans)
// fmt.Println(ans)
}2022-06-19
go
package main
import "fmt"
// 508: https://leetcode.cn/problems/most-frequent-subtree-sum/
// 11:21 - 11:32
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func findFrequentTreeSum(root *TreeNode) []int {
countMap := map[int]int{}
var dfs func(node *TreeNode) int
dfs = func(root *TreeNode) int {
if root == nil {
return 0
}
leftTreeSum := dfs(root.Left)
rightTreeSum := dfs(root.Right)
sum := leftTreeSum + rightTreeSum + root.Val
countMap[sum]++
return sum
}
dfs(root)
// fmt.Println(countMap)
maxCount := 0
ans := []int{}
for key, count := range countMap {
if count > maxCount {
maxCount = count
ans = []int{key}
} else if count == maxCount {
ans = append(ans, key)
}
}
return ans
}
func main() {
tree := &TreeNode{Val: 5, Left: &TreeNode{Val: 2}, Right: &TreeNode{Val: -3}}
fmt.Println(findFrequentTreeSum(tree))
// fmt.Println(ans)
}2022-06-16
go
package main
import (
"fmt"
"sort"
)
// 532: https://leetcode.cn/problems/k-diff-pairs-in-an-array/
// 8:18 - 8:25
func findPairs(nums []int, k int) int {
valueMap := make(map[int]int)
for _, v := range nums {
valueMap[v]++
}
keyArr := []int{}
for k := range valueMap {
keyArr = append(keyArr, k)
}
sort.Ints(keyArr)
// fmt.Printf("%v", keyArr)
ans := 0
for _, v := range keyArr {
nextValue := v + k
if nextValue != v && valueMap[nextValue] > 0 {
ans += 1
}
if nextValue == v && valueMap[nextValue] > 1 {
// fmt.Print(nextValue, valueMap[nextValue], ans)
ans += 1
}
}
return ans
}
func main() {
// nums := []int{3, 1, 4, 1, 5}
// k := 2
nums := []int{1, 2, 3, 4, 5}
k := 1
// nums := []int{1, 1, 3, 4, 5}
// k := 0
ans := findPairs(nums, k)
fmt.Println(ans)
}2022-06-14
go
package main
import "fmt"
// 498: https://leetcode.cn/problems/diagonal-traverse/
// 10:46 - 11:07
func findDiagonalOrder(mat [][]int) []int {
ans := []int{}
row := len(mat)
col := len(mat[0])
// fmt.Println(row, col)
for i := 0; i < row+col-1; i++ {
if i%2 == 1 {
x := max(i-col+1, 0)
y := min(i, col-1)
for x < row && y >= 0 {
ans = append(ans, mat[x][y])
x++
y--
}
} else {
x := min(i, row-1)
y := max(i-row+1, 0)
for x >= 0 && y < col {
ans = append(ans, mat[x][y])
x--
y++
}
}
}
return ans
}
func min(a, b int) int {
if a > b {
return b
}
return a
}
func max(a, b int) int {
if b > a {
return b
}
return a
}
func main() {
mat := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
ans := findDiagonalOrder(mat)
fmt.Println(ans)
}2022-06-13
go
package main
import (
"fmt"
"sort"
)
// 1051: https://leetcode.cn/problems/height-checker/
// 11:17- 11:24
func heightChecker(heights []int) int {
arr := []int{}
arr = append(arr, heights...)
sort.Ints(arr)
// fmt.Println(arr, heights)
ans := 0
for i := 0; i < len(arr); i++ {
// fmt.Println(heights[i], arr[i])
if heights[i] != arr[i] {
ans++
}
}
return ans
}
func main() {
// matchsticks := []int{1, 1, 2, 2, 2}
heights := []int{1, 1, 4, 2, 1, 3}
ans := heightChecker(heights)
fmt.Println(ans)
}2022-06-09
go
package main
import (
"fmt"
"math/rand"
"sort"
)
// 497: https://leetcode.cn/problems/random-point-in-non-overlapping-rectangles/
// 11:05- 11:27
type Solution struct {
rects [][]int
sum []int
}
func Constructor(rects [][]int) Solution {
sum := make([]int, len(rects)+1)
for i, r := range rects {
a, b, x, y := r[0], r[1], r[2], r[3]
sum[i+1] = sum[i] + (y-b+1)*(x-a+1)
}
return Solution{rects, sum}
}
func (s *Solution) Pick() []int {
k := rand.Intn(s.sum[len(s.sum)-1])
rectIndex := sort.SearchInts(s.sum, k+1) - 1
r := s.rects[rectIndex]
a, b, y := r[0], r[1], r[3]
da := (k - s.sum[rectIndex]) / (y - b + 1)
db := (k - s.sum[rectIndex]) % (y - b + 1)
return []int{a + da, b + db}
}
func main() {
// matchsticks := []int{1, 1, 2, 2, 2}
s := Constructor([][]int{{-2, -2, 1, 1}, {2, 2, 4, 6}})
fmt.Println(s)
fmt.Println(s.Pick())
// fmt.Println(s)
}2022-06-01
go
package main
import (
"fmt"
"sort"
)
// 473:https://leetcode.cn/problems/matchsticks-to-square/
// 9:57 - 10:25
func makesquare(matchsticks []int) bool {
sum := 0
for _, i := range matchsticks {
sum += i
}
if sum%4 != 0 {
return false
}
edge := sum / 4
for _, i := range matchsticks {
if i > edge {
return false
}
}
// fmt.Println(sum)
nums := append([]int{}, matchsticks...)
sort.Sort(sort.Reverse(sort.IntSlice(nums)))
edges := [4]int{}
var dfs func(index int) bool
dfs = func(index int) bool {
if index == len(nums) {
return true
}
for i := range edges {
edges[i] += nums[index]
if edges[i] <= edge && dfs(index+1) {
return true
}
edges[i] -= nums[index]
}
// fmt.Println(index, edges, edge)
return false
}
return dfs(0)
}
func main() {
// matchsticks := []int{1, 1, 2, 2, 2}
matchsticks := []int{3, 3, 3, 3, 4}
ans := makesquare(matchsticks)
fmt.Println(ans)
}2022-05-31
go
// 1518: https://leetcode.cn/problems/water-bottles/
// 10:42 - 10:48
func numWaterBottles(numBottles int, numExchange int) int {
ans := numBottles
temp := numBottles
for temp >= numExchange {
temp1 := temp / numExchange
ans += temp1
temp = temp%numExchange + temp1
// fmt.Println(ans, temp)
}
return ans
}
func main() {
// numBottles := 9
// numExchange := 3
// numBottles := 15
// numExchange := 4
numBottles := 5
numExchange := 5
ans := numWaterBottles(numBottles, numExchange)
fmt.Printf("%d", ans)
}2022-05-30
- https://leetcode.cn/problems/z1R5dt/
- 技巧: 字典树,前缀和,哈希;
go
type MapSum struct {
m, pre map[string]int
}
/** Initialize your data structure here. */
func Constructor() MapSum {
return MapSum{
m: make(map[string]int),
pre: make(map[string]int),
}
}
func (this *MapSum) Insert(key string, val int) {
changeNum := val
if this.m[key] > 0 {
changeNum -= this.m[key]
}
this.m[key] = val
for i := range key {
this.pre[key[:i+1]] += changeNum
}
}
func (this *MapSum) Sum(prefix string) int {
return this.pre[prefix]
}
func main() {
ans := 1
fmt.Printf("%v", ans)
obj := Constructor()
obj.Insert("insert", 1)
fmt.Printf("%v", obj)
fmt.Printf("%d", obj.Sum("in"))
}