【面试】Liveramp 面试题 面经 城市问题

以上来自:http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=138979&pid=2817216&page=1&extra=page%3D1%26filter%3Dsortid%26sortid%3D311%26searchoption%255B3089%255D%255Bvalue%255D%255B5%255D%3D5%26searchoption%255B3089%255D%255Btype%255D%3Dcheckbox%26searchoption%255B3046%255D%255Bvalue%255D%3D28%26searchoption%255B3046%255D%255Btype%255D%3Dradio#pid2817216

题目要求求出距某一节点为1,2,3,4.。。M-1距离的节点数目。

这个题目首先给出了一个用数组存tree的方法。传统方法是用链表方式。这里给出了数组方式。当然如果是二叉树,用数组很好表示,但是这里的树的度并没有限制,最终却存在一个On空间的方法,值得学习。不过这里有一个要求就是节点的值是从0开始连续的值。

任何一个树都可以选择任意一个节点作为root,然后为了表示某一个节点是root,我们可以对该节点做特殊处理,就是让其指向自己,即A[i]=i。对于其余的点,每一层都指向其父节点,A[i]=j,i是子节点,j是父节点。这样正好可以用On的数组来表示整颗树。而且表示方式是唯一的对于每一棵树而言。

解题思路是,按照bfs输出即可。当时为了满徐题目Om的复杂度,需要对tree做处理,因为要找i的孩子节点,在数组的表示下只能遍历,这样复杂度是n2,所以开始先用一个map来存每一个节点的子节点,这样查找就是O1级别的。整体的复杂度是On。

public int[] position(int[] array){
		if(array == null) return null;
		Map<Integer, List<Integer>> map = new HashMap<>();
		Queue<Integer> queue = new LinkedList<>();
		for(int i = 0; i < array.length; i++){
			int des = array[i];
			if(des == i){
				queue.add(i);
				continue;
			}
			if(!map.containsKey(des))
				map.put(des, new ArrayList<>());
			map.get(des).add(i);
		}
		int[] res = new int[array.length - 1];
		int layer = -1;
		while(!queue.isEmpty()){
			int size = queue.size();
			if(layer != -1)
				res[layer] = size;
			for(int i = 0; i < size; i++){
				int des = queue.poll();
				List<Integer> list = map.get(des);
				if(list != null)
					queue.addAll(list);
			}
			layer++;
		}
		return res;
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值