字节跳动(头条)ByteCamp2021夏令营笔试题目及题解

环境

使用的是牛客的平台,ACM输入输出
2021.6.13夏令营第二批面试

题目1

给定一颗完全二叉树,按规则选择结点。如果选择了一个节点的任意子节点(或两个都选),就不能选择该结点。(说白了就是一条连线两端只能选一个节点)求选择结点的值的和最大值多少。

输入:
第一行是二叉树结点个数
第二行是按行遍历顺序的完全二叉树

如:

3
8 4 6

输出:

10

题解:
类似于leetcode的打家劫舍问题,和打家劫舍3一模一样。

package main

import "fmt"

var N int
var tree []int

func main() {
   
	fmt.Scan(&N)
	tree = make([]int, N)
	for i := 0; i < N; i++ {
   
		fmt.Scan(&tree[i])
	}
	//N = 9
	//tree = []int{5194, 34, 91, 51, 72, 46, 12, 9812, 6054}
	result := dfs1(0)
	fmt.Println(max(result[0], result[1]))
}

func dfs1(n int) []int {
   
	if n > N-1 {
   
		return []int{
   0, 0}
	}
	l, r := dfs1(2*n+1), dfs1(2*n+2)
	selected := tree[n] + l[1] + r[1]
	noselected := max(l[0], l[1]) + max(r[0], r[1])
	return []int{
   selected, noselected}
}

func max(a, b int) int {
   
	if a > b {
   
		return a
	}
	return b
}
  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苏打呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值