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

文章提供了两道算法题目的解法,分别是关于在二叉树中打家劫舍(不触发警报下最大化盗窃金额)的问题和计算整数二进制表示中1的个数。文章通过递归和动态规划给出了高效的解决方案,并附有代码示例。

 

目录

337. 打家劫舍 III House Robber iii  🌟🌟

338. 比特位计数 Counting Bits  🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


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.youkuaiyun.com/ 

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)暂停更

Golang每日一库是一个系列的文章,旨在介绍Golang中的各种优秀的第三方库。其中一篇文章介绍了zap库和logrus库。\[1\]zap库是Golang中性能最高的日志库,而logrus库虽然已经不再维护和更新,但在使用的简易程度方面更好用一些。\[1\]除了这两个库,还有很多其他的日志库可以选择。另外,flag库也是Golang中常用的库之一,用于处理命令行参数。\[2\]\[3\]flag库提供了多种选项类型,包括自定义选项类型和时间间隔类型。自定义选项类型可以根据需求进行定义,而时间间隔类型支持多种格式,如"300ms"、"-1.5h"、"2h45m"等。\[2\]\[3\]这些库都是Golang开发中常用的工具,可以帮助开发者更高效地进行日志记录和命令行参数处理。 #### 引用[.reference_title] - *1* [Golang一日一库之logrus](https://blog.youkuaiyun.com/Zuko_chen/article/details/130212672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Go每日一库之Flag](https://blog.youkuaiyun.com/weixin_43999327/article/details/130701461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值