Golang每日一练(leetDay0117) 打家劫舍III、比特位计数

简介: Golang每日一练(leetDay0117) 打家劫舍III、比特位计数

337. 打家劫舍 III House Robber iii

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额

示例 1:

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

输出: 7

解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

输入: root = [3,4,5,1,3,null,1]

输出: 9

解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9


提示:

  • 树的节点数在 [1, 10^4] 范围内
  • 0 <= Node.val <= 10^4

相关:

198. 打家劫舍 I House Robber  🌟🌟

213. 打家劫舍 II House Robber ii  🌟🌟

代码:

package main
import "fmt"
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func rob(root *TreeNode) int {
  robResult, notRobResult := _rob(root)
  return max(robResult, notRobResult)
}
func _rob(node *TreeNode) (int, int) {
  if node == nil {
    return 0, 0
  }
  leftRob, leftNotRob := _rob(node.Left)
  rightRob, rightNotRob := _rob(node.Right)
  robResult := node.Val + leftNotRob + rightNotRob
  notRobResult := max(leftRob, leftNotRob) + max(rightRob, rightNotRob)
  return robResult, notRobResult
}
func max(a, b int) int {
  if a > b {
    return a
  }
  return b
}
func listToTree(lst []interface{}) *TreeNode {
  if len(lst) == 0 {
    return nil
  }
  root := &TreeNode{Val: lst[0].(int)}
  queue := []*TreeNode{root}
  i := 1
  for i < len(lst) {
    node := queue[0]
    queue = queue[1:]
    if lst[i] != nil {
      node.Left = &TreeNode{Val: lst[i].(int)}
      queue = append(queue, node.Left)
    }
    i++
    if i < len(lst) && lst[i] != nil {
      node.Right = &TreeNode{Val: lst[i].(int)}
      queue = append(queue, node.Right)
    }
    i++
  }
  return root
}
func main() {
  nums := []interface{}{3, 2, 3, nil, 3, nil, 1}
  root := listToTree(nums)
  fmt.Println(rob(root))
  nums = []interface{}{3, 4, 5, 1, 3, nil, 1}
  root = listToTree(nums)
  fmt.Println(rob(root))
}

输出:

7

9


338. 比特位计数 Counting Bits

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

示例 1:

输入:n = 2

输出:[0,1,1]

解释:

0 --> 0

1 --> 1

2 --> 10


示例 2:

输入:n = 5

输出:[0,1,1,2,1,2]

解释:

0 --> 0

1 --> 1

2 --> 10

3 --> 11

4 --> 100

5 --> 101


提示:

  • 0 <= n <= 10^5

进阶:

  • 很容易就能实现时间复杂度为 O(n log n) 的解决方案,你可以在线性时间复杂度 O(n) 内用一趟扫描解决此问题吗?
  • 你能不使用任何内置函数解决此问题吗?(如,C++ 中的 __builtin_popcount

代码:动态规划

package main
import "fmt"
func countBits(n int) []int {
  ans := make([]int, n+1)
  for i := 1; i <= n; i++ {
    ans[i] = ans[i&(i-1)] + 1
  }
  return ans
}
func main() {
  fmt.Println(countBits(2))
  fmt.Println(countBits(5))
}

输出:

[0 1 1]

[0 1 1 2 1 2]

逐位计算:

```golang
func countBits(n int) []int {
    ans := make([]int, n+1)
    for i := 0; i <= n; i++ {
        count := 0
        num := i
        for num != 0 {
            count += num & 1
            num >>= 1
        }
        ans[i] = count
    }
    return ans
}
```

🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更


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