对角线遍历
对角线遍历
解题思路
划分为两种遍历形式:朝着右上方遍历和朝着左下方遍历。
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| func findDiagonalOrder(mat [][]int) []int { m := len(mat) n := len(mat[0]) res := make([]int, m*n) count := 0 row, col := 0, 0 for count < m*n { if row == m-1 && col == n-1 { res [count] = mat[row][col] break } for row >= 0 && col < n { res[count] = mat[row][col] count++ row-- col++ } if col < n { row++ } else { row += 2 col-- } for row < m && col >= 0 { res[count] = mat[row][col] count++ row++ col-- } if row < m { col++ } else { col += 2 row-- } }
return res }
|
长度最小的子数组
长度最小的子数组
解题思路
利用滑动窗口的思想,start
指向窗口的起始位置,end
指向窗口的终止位置的后一位,sum
为窗口内数字之和:
- 如果
sum < target
,end
需要向后移动
- 如果
sum > target
,start
需要向前移动
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| func minSubArrayLen(target int, nums []int) int { start, end := 0, 0 minLen := math.MaxInt64 sum := 0 for end < len(nums) { for sum < target && end < len(nums) { sum += nums[end] end++ } for sum >= target { if end-start < minLen { minLen = end-start } sum -= nums[start] start++ } }
if minLen == math.MaxInt64 { return 0 } else { return minLen } }
|
删除二叉搜索树中的节点
删除二叉搜索树中的节点
解题思路
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
func deleteNode(root *TreeNode, key int) *TreeNode { if root != nil { if root.Val == key { if root.Left == nil && root.Right == nil { return nil } if root.Left != nil && root.Right == nil { return root.Left } if root.Right != nil && root.Left == nil { return root.Right } next := nextNode(root) root.Val, next.Val = next.Val, root.Val root.Right = deleteNode(root.Right, key) } else if root.Val > key { root.Left = deleteNode(root.Left, key) } else { root.Right = deleteNode(root.Right, key) } }
return root }
func nextNode(root *TreeNode) *TreeNode { next := root.Right for next.Left != nil { next = next.Left } return next }
|