BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #55548同步于 2017/3/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

阿里这道题目如何做?

Gao2017
2017/3/15镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
myjiayan机器人#1 · 2017/3/15
我觉得用数组表示二叉树可行。
Gao2017机器人#2 · 2017/3/15
【 在 myjiayan 的大作中提到: 】 : 我觉得用数组表示二叉树可行。 可以说的具体点吗?我的思路是先构造二叉树,然后递归求路径和。但是不知道如何构造二叉树。
lbjboat机器人#3 · 2017/3/15
递归,判定条件:百位增加且十位是上一个选定数字十位的两倍或两倍加一,个位相加,直到找不到下一个满足条件的点,记录一条路径的和,然后回溯
lbjboat机器人#4 · 2017/3/15
两倍减一,刚打错了,另外,别去构造二叉树 【 在 lbjboat (【钧涵团】人生多桎梏|流浪不可期) 的大作中提到: 】 : 递归,判定条件:百位增加且十位是上一个选定数字十位的两倍或两倍加一,个位相加,直到找不到下一个满足条件的点,记录一条路径的和,然后回溯
Mmagicc机器人#5 · 2017/3/16
【 在 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; } 数组表示二叉树的思路
shaonianpai机器人#6 · 2017/3/16
你这个上一个选定,怎么记录, 其实初始化一个4,8的全0二维数组就能做,一遍遍历记录数,再一遍遍历,叠加上层父亲节点作为当前节点的总和,如果是叶子节点,就把总路径和加上当前状态的和。时间复杂度(m*n) 空间(m*n) 【 在 lbjboat 的大作中提到: 】 : 递归,判定条件:百位增加且十位是上一个选定数字十位的两倍或两倍加一,个位相加,直到找不到下一个满足条件的点,记录一条路径的和,然后回溯
lbjboat机器人#7 · 2017/3/16
没太懂你的那个复杂度分析中m和n分别是啥,是二维数组的行列么,另外你的方法也没太弄懂,一遍记录,一遍遍历,所以是o(n)? 我这个可能不太好,但是确实能做。 【 在 shaonianpai 的大作中提到: 】 : 你这个上一个选定,怎么记录, : 其实初始化一个4,8的全0二维数组就能做,一遍遍历记录数,再一遍遍历,叠加上层父亲节点作为当前节点的总和,如果是叶子节点,就把总路径和加上当前状态的和。时间复杂度(m*n) 空间(m*n) :
lbjboat机器人#8 · 2017/3/16
貌似可以微改一下 【 在 lbjboat 的大作中提到: 】 : 没太懂你的那个复杂度分析中m和n分别是啥,是二维数组的行列么,另外你的方法也没太弄懂,一遍记录,一遍遍历,所以是o(n)? 我这个可能不太好,但是确实能做。 :
mzcwudi机器人#9 · 2017/3/16
我说一下我的想法啊,因为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*个位,逐渐往上走,就结束了