输入N组父子对,求父子对所组成的二叉树的高度----17年某公司的笔试题
题目的大致意思如下:
输入N组数,一组数代表一个父子对(如,0 1,0代表父节点,1代表子节点),求这N组数所组成的二叉树的高度;
例如:
输入:6
0 1
0 2
1 3
1 4
2 5
3 6
输出:4
解题思路:动态规划法,使用一个数组hight[N]记录每组数所能组成的二叉树的高度,初始化为全1数组,使用一个数组visited[N]来记录每组数的访问情况,找出最优子结构:
当visited[i]=0时,visited[i]=1,hight[i] = hight[i]+1;
然后,当matrix[j][0]=matrix[i][1]且visited[j]=0时,hight[j] = hight[i]+1,visited[j]=1;
代码如下:
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int groups = scanner.nextInt();
int[][] matrix = new int[groups][2];for(int i=0;i<groups;i++){
for(int j=0;j<2;j++){
matrix[i][j] = scanner.nextInt();
}
}
//动态规划输出处理
System.out.println(maxHightHelper(matrix));
}
}//动态规划
public static int maxHightHelper(int[][] matrix){
if(matrix==null||matrix.length==0)
return 0;
//记录当前组的高度
int[] hight = new int[matrix.length];
for(int i=0;i<hight.length;i++)
hight[i] = 1;
byte[] visited = new byte[matrix.length];
for(int i=0;i<matrix.length;i++){
if(visited[i]==0){
visited[i] = 1;
hight[i] = hight[i]+1;
}
for(int j=i+1;j<matrix.length;j++){
if(matrix[j][0]==matrix[i][1]&&visited[j]==0){
visited[j] = 1;
hight[j] = hight[i] +1;
}
}
}
//找最大的高度
int max = 0;
for(int i=0;i<hight.length;i++){
if(max<hight[i])
max = hight[i];
}
return max;
}
}
输入N组父子对,求父子对所组成的二叉树的高度----17年某公司的笔试题的更多相关文章
- 求一个int型整数的两种递减数之和(华为2015笔试题及答案)
给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同 ...
- ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)
1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 177 Solved: 136[Submit][Status ...
- HDU 1710 二叉树遍历,输入前、中序求后序
1.HDU 1710 Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分 ...
- 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:首先最先想到的是遍历从1到n的每 ...
- 牛客OJ——[编程题]A+B和C__如何输入多组测试数据(测试OK)
几个要注意的地方: (1)Java OJ,必须将类名写成Main (2)关于如何输入多组测试数据,用二维数组去存储是一个方法,直接在while里面做也可以 但是如果 (3)关于整形 ...
- 从键盘输入当月利润I,求应发放奖金总数?
企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%:20万到40万之间时 ...
- invalid types 'int[int]' for array subscript// EOF 输入多组数据//如何键盘输入EOF
数组维度搞错了 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止 while(scanf("%d %d",&a, &b) != EOF) // 输入结束 ...
- 【C语言】输入一个整数N,求N以内的素数之和
[C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...
- C/C++中输入多组数据方法
--------开始-------- 对于刚开始学编程的人来说每次基本上就是一次数据输入,多次的话基本也是会给定一个数组的大小,但随着做刷算法题开始,题目有的会不直接告诉输入几组数据,基本输入都是多组 ...
随机推荐
- go get中的...
go get命令是go自带的包下载工具. 如果配置了GOPATH,下载的文件放置于GOPATH/src下面 例如 $ go get github.com/garyburd/redigo/redis $ ...
- 杂项:node.js
ylbtech-杂项:node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.No ...
- [UE4]角色增加挂点、增加枪
人物骨骼增加Socket(骨骼) 增加手持武器预览: 角色蓝图增加组件“Skeletal Mesh”(好像这叫骨骼模型吧),并拖放至人物“Mesh”下面作为子组件. 选中刚建好的“SkeletalMe ...
- 批处理框架-spring Batch
并发处理业务 数据量大,并发度高,要支持事物,回滚,并发机制.事务.并发.监控.执行等,并不提供相应的调度功能.因此,如果我们希望批处理任务定期执行,可结合 Quartz 等成熟的调度框架实现. 业务 ...
- centos6性能监控软件
常用软件在此下载 http://rpm.pbone.net/ http://pkgs.org/ collectl 显示cpu\disk\network的实时信息http://dl.fedoraproj ...
- 原生socket请求url获取状态码、消息报头、响应正文
需求: (1)使用socket及ssl模块写通用的web客户端 (2)向服务器发起请求 (3)接受响应内容并解析出状态码.消息报头.响应正文 (4)最核心的函数: 输入一个url,返回状态码.消息报头 ...
- string hashcode 解读
偶尔看到string hashcode方法如下 public int hashCode() { int h = hash; if (h == 0 && value.length > ...
- Mysql-事务,原子性操作
事物分为 自动(默认的)和手动(需开启事务)两种 -- 事务 start transaction; -- commite; 提交事务 -- rollback; 回滚事务 create table if ...
- 1.scrapyd部署相关问题
部署scrapy爬虫项目到6800上 启动scrapyd 出现问题 1: scrapyd-deloy -l 未找到相关命令 scrapyd-deploy -l 可以看到当前部署的爬虫项目,但是当我输 ...
- leetcode13
public class Solution { private int ChangeToInt(char c) { ; string s = c.ToString(); switch (s) { ca ...