Golang每日一练(leetDay0068) 二叉树右视图、岛屿数量

简介: Golang每日一练(leetDay0068) 二叉树右视图、岛屿数量

199. 二叉树的右视图 Binarytree Right Side View


给定一个二叉树的 根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。


示例 1:

9b7c96111432857ed953f8166f385e28.jpeg



输入: [1,2,3,null,5,null,4]

输出: [1,3,4]


示例 2:

输入: [1,null,3]

输出: [1,3]


示例 3:

输入: []

输出: []


提示:

   二叉树的节点个数的范围是 [0,100]

   -100 <= Node.val <= 100  


代码:

package main
import "fmt"
const null = -1 << 31
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func (root *TreeNode) RightSideView() []int {
  var res []int
  if root == nil {
    return res
  }
  queue := []*TreeNode{root}
  for len(queue) > 0 {
    n := len(queue)
    for i := 0; i < n; i++ {
      node := queue[i]
      if i == n-1 {
        res = append(res, node.Val)
      }
      if node.Left != nil {
        queue = append(queue, node.Left)
      }
      if node.Right != nil {
        queue = append(queue, node.Right)
      }
    }
    queue = queue[n:]
  }
  return res
}
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 ArrayToString(arr []int) string {
  res := "["
  for i := 0; i < len(arr); i++ {
    res += fmt.Sprint(arr[i])
    if i != len(arr)-1 {
      res += ","
    }
  }
  return res + "]"
}
func main() {
  nums := []int{1, 2, 3, null, 5, null, 4}
  root := buildTree(nums)
  fmt.Println(ArrayToString(root.RightSideView()))
  nums = []int{1, null, 3}
  root = buildTree(nums)
  fmt.Println(ArrayToString(root.RightSideView()))
}


输出:

[1,3,4]

[1,3]


200. 岛屿数量 Number-of-islands


给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。


岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。


此外,你可以假设该网格的四条边均被水包围。


示例 1:

输入:grid = [

 ["1","1","1","1","0"],

 ["1","1","0","1","0"],

 ["1","1","0","0","0"],

 ["0","0","0","0","0"]]

输出:1


示例 2:

输入:grid = [

 ["1","1","0","0","0"],

 ["1","1","0","0","0"],

 ["0","0","1","0","0"],

 ["0","0","0","1","1"]]

输出:3


提示:

   m == grid.length

   n == grid[i].length

   1 <= m, n <= 300

   grid[i][j] 的值为 '0' 或 '1'


代码:

package main
import "fmt"
func numIslands(grid [][]byte) int {
  // 迭代整个网格,遇到陆地时就进行 DFS 搜索,找到一个区域后计数器加一
  m, n := len(grid), len(grid[0])
  var count int
  for i := 0; i < m; i++ {
    for j := 0; j < n; j++ {
      if grid[i][j] == '1' {
        count++
        dfs(grid, i, j, m, n)
      }
    }
  }
  return count
}
// DFS 搜索函数,将所有和当前岛屿相邻的陆地都标记为已遍历
func dfs(grid [][]byte, i, j, m, n int) {
  // 避免越界
  if i < 0 || j < 0 || i >= m || j >= n || grid[i][j] == '0' {
    return
  }
  // 标记当前位置为已遍历
  grid[i][j] = '0'
  // DFS 搜索四周的陆地
  dfs(grid, i+1, j, m, n)
  dfs(grid, i-1, j, m, n)
  dfs(grid, i, j+1, m, n)
  dfs(grid, i, j-1, m, n)
}
func main() {
  grid1 := [][]byte{
    {'1', '1', '1', '1', '0'},
    {'1', '1', '0', '1', '0'},
    {'1', '1', '0', '0', '0'},
    {'0', '0', '0', '0', '0'},
  }
  fmt.Println(numIslands(grid1))
  grid2 := [][]byte{
    {'1', '1', '0', '0', '0'},
    {'1', '1', '0', '0', '0'},
    {'0', '0', '1', '0', '0'},
    {'0', '0', '0', '1', '1'},
  }
  fmt.Println(numIslands(grid2))
}


输出:

1

3


目录
相关文章
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
195 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
173 0
Linux 终端命令之文件浏览(2) more
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
286 0
Linux 终端操作命令(2)内部命令
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
209 0
力扣 C++|一题多解之动态规划专题(2)
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
260 0
Python Numpy入门基础(一)创建数组
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
1184 0
Java语言程序设计试卷6套
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
171 1
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
633 4
Golang语言之管道channel快速入门篇
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
241 4
Golang语言文件操作快速入门篇
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
528 3
Golang语言之gRPC程序设计示例