Golang每日一练(leetDay0080) 矩形面积、翻转二叉树

简介: Golang每日一练(leetDay0080) 矩形面积、翻转二叉树

223. 矩形面积 Rectangle Area


给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。


每个矩形由其 左下 顶点和 右上 顶点坐标表示:

  • 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。
  • 第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。

示例 1:

2b288b68d6e9ecad32f3b145a99ab005.png





输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2

输出:45


示例 2:

输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2

输出:16

提示:

   -10^4 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 10^4

代码:


package main
import (
  "fmt"
)
func computeArea(ax1 int, ay1 int, ax2 int, ay2 int, bx1 int, by1 int, bx2 int, by2 int) int {
  area1 := (ax2 - ax1) * (ay2 - ay1)
  area2 := (bx2 - bx1) * (by2 - by1)
  overlapWidth, overlapHeight := 0, 0
  overlapWidth = min(ax2, bx2) - max(ax1, bx1)
  overlapHeight = min(ay2, by2) - max(ay1, by1)
  overlapArea := max(overlapWidth, 0) * max(overlapHeight, 0)
  return area1 + area2 - overlapArea
}
func max(a, b int) int {
  if a > b {
    return a
  }
  return b
}
func min(a, b int) int {
  if a < b {
    return a
  }
  return b
}
func main() {
  ax1 := -3; ay1 := 0; ax2 := 3; ay2 := 4
  bx1 := 0; by1 := -1; bx2 := 9; by2 := 2
  fmt.Println(computeArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2))
  ax1 = -2; ay1 = -2; ax2 = 2; ay2 = 2
  bx1 = -2; by1 = -2; bx2 = 2; by2 = 2
  fmt.Println(computeArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2))
}

输出:

45

16


226. 翻转二叉树 Invert Binary Tree


给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

352678c71bb0d36913fe4361c76b8714.jpeg


输入:root = [4,2,7,1,3,6,9]

输出:[4,7,2,9,6,3,1]


示例 2:

17415d40285241f65cb2b4734088e7b5.jpeg

输入:root = [2,1,3]

输出:[2,3,1]


示例 3:

输入:root = []

输出:[]


提示:

  • 树中节点数目范围在 [0, 100]
  • -100 <= Node.val <= 100

代码:

package main
import "fmt"
const null = -1 << 31
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func invertTree(root *TreeNode) *TreeNode {
  if root == nil {
    return nil
  }
  queue := []*TreeNode{root}
  for len(queue) > 0 {
    curr := queue[0]
    queue = queue[1:]
    left := curr.Left
    curr.Left = curr.Right
    curr.Right = left
    if curr.Left != nil {
      queue = append(queue, curr.Left)
    }
    if curr.Right != nil {
      queue = append(queue, curr.Right)
    }
  }
  return root
}
func buildTree(nums []int) *TreeNode {
  if len(nums) == 0 {
    return nil
  }
  root := &TreeNode{Val: nums[0]}
  Queue := []*TreeNode{root}
  idx := 1
  for idx < len(nums) {
    node := Queue[0]
    Queue = Queue[1:]
    if nums[idx] != null {
      node.Left = &TreeNode{Val: nums[idx]}
      Queue = append(Queue, node.Left)
    }
    idx++
    if idx < len(nums) && nums[idx] != null {
      node.Right = &TreeNode{Val: nums[idx]}
      Queue = append(Queue, node.Right)
    }
    idx++
  }
  return root
}
func levelOrder(root *TreeNode) []int {
  res := []int{}
  if root == nil {
    return res
  }
  Queue := []*TreeNode{root}
  for len(Queue) > 0 {
    level := []int{}
    n := len(Queue)
    for i := 0; i < n; i++ {
      cur := Queue[0]
      Queue = Queue[1:]
      level = append(level, cur.Val)
      if cur.Left != nil {
        Queue = append(Queue, cur.Left)
      }
      if cur.Right != nil {
        Queue = append(Queue, cur.Right)
      }
    }
    res = append(res, level...)
  }
  return res
}
func ArrayToString(arr []int) string {
  res := "["
  for i := 0; i < len(arr); i++ {
    res += fmt.Sprint(arr[i]) //对[]int数组可以用strconv.Itoa(arr[i])
    if i != len(arr)-1 {
      res += ","
    }
  }
  return res + "]"
}
func main() {
  nums := []int{4, 2, 7, 1, 3, 6, 9}
  root := buildTree(nums)
  fmt.Println(ArrayToString(levelOrder(root)))
  root = invertTree(root)
  fmt.Println(ArrayToString(levelOrder(root)))
  nums = []int{2, 1, 3}
  root = buildTree(nums)
  fmt.Println(ArrayToString(levelOrder(root)))
  root = invertTree(root)
  fmt.Println(ArrayToString(levelOrder(root)))
}


输出:

[4,2,7,1,3,6,9]

[4,7,2,9,6,3,1]

[2,1,3]

[2,3,1]

递归法:

```Go
func invertTree(root *TreeNode) *TreeNode {
    if root == nil {
        return nil
    }
    left := invertTree(root.Left)
    right := invertTree(root.Right)
    root.Left = right
    root.Right = left
    return root
}
```


目录
相关文章
|
5月前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
82 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
5月前
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
57 0
Linux 终端命令之文件浏览(2) more
|
5月前
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
50 0
Linux 终端操作命令(2)内部命令
|
5月前
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
57 0
力扣 C++|一题多解之动态规划专题(2)
|
5月前
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
62 0
Python Numpy入门基础(一)创建数组
|
5月前
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
542 0
Java语言程序设计试卷6套
|
1月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
53 4
Golang语言之管道channel快速入门篇
|
1月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
46 4
Golang语言文件操作快速入门篇
|
1月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
53 3
Golang语言之gRPC程序设计示例
|
1月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
43 4