add new solutions

This commit is contained in:
kanna5 2026-01-05 16:48:03 +09:00
parent d798d5e8c9
commit 886b5e0a8e
Signed by: kkyy
GPG key ID: 06332F3965E9B0CF
34 changed files with 1164 additions and 0 deletions

View file

@ -0,0 +1,27 @@
package q128
func longestConsecutive(nums []int) int {
set := make(map[int]struct{}, len(nums))
for _, n := range nums {
set[n] = struct{}{}
}
longest := 0
for n := range set {
if _, ok := set[n-1]; ok {
continue
}
r := n
for {
if _, ok := set[r+1]; ok {
r++
} else {
break
}
}
longest = max(longest, r-n+1)
}
return longest
}
var _ = longestConsecutive

View file

@ -0,0 +1,37 @@
package q130
func markI(board [][]byte, x, y int) {
w, h := len(board[0]), len(board)
if x < 0 || y < 0 || x >= w || y >= h || board[y][x] != 'O' {
return
}
board[y][x] = 'I'
markI(board, x, y+1)
markI(board, x, y-1)
markI(board, x+1, y)
markI(board, x-1, y)
}
func solve(board [][]byte) {
for i := range len(board) {
markI(board, 0, i)
markI(board, len(board[0])-1, i)
}
for i := range len(board[0]) {
markI(board, i, 0)
markI(board, i, len(board)-1)
}
for y := range board {
for x := range board[0] {
switch board[y][x] {
case 'O':
board[y][x] = 'X'
case 'I':
board[y][x] = 'O'
}
}
}
}
var _ = solve

View file

@ -0,0 +1,34 @@
package q138
type Node struct {
Val int
Next *Node
Random *Node
}
func copyRandomList(head *Node) *Node {
idx := make(map[*Node]*Node, 256)
p := head
for p != nil {
newNode := *p // copy
idx[p] = &newNode
p = p.Next
}
p = head
for p != nil {
newNode := idx[p]
if newNode.Next != nil {
newNode.Next = idx[newNode.Next]
}
if newNode.Random != nil {
newNode.Random = idx[newNode.Random]
}
p = p.Next
}
return idx[head]
}
var _ = copyRandomList

View file

@ -0,0 +1,28 @@
package q139
func wordBreak(s string, wordDict []string) bool {
possible := make([]bool, len(s)+1)
possible[0] = true
for l := range possible {
if !possible[l] {
continue
}
for i := range wordDict {
newLen := len(wordDict[i]) + l
if newLen > len(s) {
continue
}
if possible[newLen] {
continue
}
if s[l:newLen] == wordDict[i] {
possible[newLen] = true
}
}
}
return possible[len(s)]
}
var _ = wordBreak

View file

@ -0,0 +1,18 @@
package q153
func findMin(nums []int) int {
l, r := 0, len(nums)
for l < r && nums[l] > nums[r-1] {
m := (l + r) / 2
if nums[m] > nums[r-1] {
l = m + 1
} else {
r = m + 1
l++
}
}
return nums[l]
}
var _ = findMin

View file

@ -0,0 +1,24 @@
package q162
// Important constraint: nums[i] != nums[i + 1]
func findPeakElement(nums []int) int {
l, r := 0, len(nums)
for l < r {
m := (l + r) / 2
lLower := m == 0 || nums[m-1] < nums[m]
rLower := m == len(nums)-1 || nums[m+1] < nums[m]
if lLower && rLower {
return m
}
if !lLower { // left side is higher
r = m
} else {
l = m + 1
}
}
return -1
}
var _ = findPeakElement