返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #55548同步于 2017/3/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
阿里这道题目如何做?
Gao2017
2017/3/15镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 myjiayan 的大作中提到: 】
: 我觉得用数组表示二叉树可行。
可以说的具体点吗?我的思路是先构造二叉树,然后递归求路径和。但是不知道如何构造二叉树。
两倍减一,刚打错了,另外,别去构造二叉树
【 在 lbjboat (【钧涵团】人生多桎梏|流浪不可期) 的大作中提到: 】
: 递归,判定条件:百位增加且十位是上一个选定数字十位的两倍或两倍加一,个位相加,直到找不到下一个满足条件的点,记录一条路径的和,然后回溯
【 在 Gao2017 的大作中提到: 】
public static int calPathSum(int[] nums) {
if (nums.length == 1) return nums[0]%10;
Map<Integer, Integer> res = new HashMap<Integer, Integer>();
int depth = 0;
int count = 0;
for (int i : nums) {
depth = (int) (Math.pow(2, i/100 - 1) + (i%100)/10) - 1;
res.put((int) (Math.pow(2, i/100 - 1) + (i%100)/10) - 1, i%10);
}
for (int i = depth; i > 1; i--) {
if (!res.containsKey(i*2)) {
count = calPath(res, i, count);
}
}
return count;
}
public static int calPath(Map<Integer, Integer> hashMap, int index, int count) {
count+=hashMap.get(index);
if (hashMap.containsKey(index/2)) {
count = calPath(hashMap, index/2, count);
}
return count;
}
数组表示二叉树的思路
你这个上一个选定,怎么记录,
其实初始化一个4,8的全0二维数组就能做,一遍遍历记录数,再一遍遍历,叠加上层父亲节点作为当前节点的总和,如果是叶子节点,就把总路径和加上当前状态的和。时间复杂度(m*n) 空间(m*n)
【 在 lbjboat 的大作中提到: 】
: 递归,判定条件:百位增加且十位是上一个选定数字十位的两倍或两倍加一,个位相加,直到找不到下一个满足条件的点,记录一条路径的和,然后回溯
没太懂你的那个复杂度分析中m和n分别是啥,是二维数组的行列么,另外你的方法也没太弄懂,一遍记录,一遍遍历,所以是o(n)? 我这个可能不太好,但是确实能做。
【 在 shaonianpai 的大作中提到: 】
: 你这个上一个选定,怎么记录,
: 其实初始化一个4,8的全0二维数组就能做,一遍遍历记录数,再一遍遍历,叠加上层父亲节点作为当前节点的总和,如果是叶子节点,就把总路径和加上当前状态的和。时间复杂度(m*n) 空间(m*n)
:
貌似可以微改一下
【 在 lbjboat 的大作中提到: 】
: 没太懂你的那个复杂度分析中m和n分别是啥,是二维数组的行列么,另外你的方法也没太弄懂,一遍记录,一遍遍历,所以是o(n)? 我这个可能不太好,但是确实能做。
:
我说一下我的想法啊,因为l最多4层,所以降低了很多难度,可不可以数组从后往前扫,把百位最高的数先扫一遍,map<int,int>,第一个int是第十位,第二个参数是这个节点下面有多少个分支,把个位加到sum里,然后再往前扫,如果总共4层的话,第三层的话就在map里面找十位的2倍,比如说311的话就在map里面找有没有1和2,321的话就在map里面找3和4,然后把找到的key删了,再存进去第三层的,比如说找的是<1,1><2,1>,把这两个删了存进去一个<1,2>,就表示第三层的第一个节点有两个子节点,sum就加上这个value*个位,逐渐往上走,就结束了