diff --git a/solutions/1/q199/solution.go b/solutions/1/q199/solution.go new file mode 100644 index 0000000..3ee35a9 --- /dev/null +++ b/solutions/1/q199/solution.go @@ -0,0 +1,37 @@ +package q199 + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +func rightSideView(root *TreeNode) []int { + ret := []int{} + + type qElem struct { + height int + node *TreeNode + } + + queue := []qElem{{0, root}} + var last *qElem + for ; len(queue) > 0; queue = queue[1:] { + cur := &queue[0] + if cur.node == nil { + continue + } + if last != nil && last.height < cur.height { + ret = append(ret, last.node.Val) + } + last = cur + queue = append(queue, qElem{cur.height + 1, cur.node.Left}, qElem{cur.height + 1, cur.node.Right}) + } + if last != nil { + ret = append(ret, last.node.Val) + } + + return ret +} + +var _ = rightSideView diff --git a/solutions/2/q200/solution.go b/solutions/2/q200/solution.go new file mode 100644 index 0000000..9564d9a --- /dev/null +++ b/solutions/2/q200/solution.go @@ -0,0 +1,31 @@ +package q200 + +const ( + VISITED byte = '.' + LAND byte = '1' +) + +func traverse(grid [][]byte, x, y int) int { + if x < 0 || y < 0 || x >= len(grid[0]) || y >= len(grid) || grid[y][x] != LAND { + return 0 + } + + grid[y][x] = VISITED + traverse(grid, x+1, y) + traverse(grid, x-1, y) + traverse(grid, x, y+1) + traverse(grid, x, y-1) + return 1 +} + +func numIslands(grid [][]byte) int { + count := 0 + for y := range grid { + for x := range grid[y] { + count += traverse(grid, x, y) + } + } + return count +} + +var _ = numIslands diff --git a/solutions/5/q530/solution.go b/solutions/5/q530/solution.go new file mode 100644 index 0000000..673014c --- /dev/null +++ b/solutions/5/q530/solution.go @@ -0,0 +1,37 @@ +package q530 + +import "math" + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +func getMinimumDifference(root *TreeNode) int { + minDiff := math.MaxInt + var last *int + + var check = func(num int) { + if last == nil { + last = &num + return + } + minDiff = min(minDiff, num-*last) + *last = num + } + var traverse func(node *TreeNode) + traverse = func(node *TreeNode) { + if node == nil { + return + } + traverse(node.Left) + check(node.Val) + traverse(node.Right) + } + traverse(root) + + return minDiff +} + +var _ = getMinimumDifference diff --git a/solutions/9/q909/solution.go b/solutions/9/q909/solution.go new file mode 100644 index 0000000..bd1e397 --- /dev/null +++ b/solutions/9/q909/solution.go @@ -0,0 +1,50 @@ +package q909 + +func coord(n, num int) (x, y int) { + num -= 1 + row := num / n + y = n - row - 1 + x = num % n + if row%2 == 1 { + x = n - 1 - x + } + return +} + +func snakesAndLadders(board [][]int) int { + n, sqN := len(board), len(board)*len(board) + leastRolls := make([]int, sqN) + if len(leastRolls) == 1 { + return 0 + } + + queue := make([]int, 0, sqN) + queue = append(queue, 1) + for ; len(queue) > 0; queue = queue[1:] { + cur := queue[0] + for dist := 1; dist <= 6 && cur+dist <= sqN; dist++ { + next := cur + dist + x, y := coord(n, next) + if board[y][x] != -1 { + next = board[y][x] + } + rolls := leastRolls[cur-1] + 1 + + if (next > 1 && leastRolls[next-1] == 0) || rolls < leastRolls[next-1] { + leastRolls[next-1] = rolls + if next == sqN { + return rolls + } + queue = append(queue, next) + } + } + } + + l := leastRolls[sqN-1] + if l == 0 { + return -1 + } + return 0 +} + +var _ = snakesAndLadders