leetcode 310. 最小高度树 【时间击败70.67%】 【内存击败89.04%】

 

数组替代队列,从超时到击败70%,用tree[0]替代new一个新的ArrayList,上升10%

 

思想是遍历一遍,删除度为1的节点,答案只可能为1或2

 

 1 public List<Integer> findMinHeightTrees(int n, int[][] edges) {
 2         ArrayList<Integer>[] tree = new ArrayList[n];
 3         for (int i = 0; i < n; i++) tree[i] = new ArrayList<>();
 4         for (int i = 0; i < edges.length; i++) {
 5             int a = edges[i][0], b = edges[i][1];
 6             tree[a].add(b);
 7             tree[b].add(a);
 8         }
 9         int[] valid = new int[n];
10         Arrays.fill(valid, 1);
11         int[] q = new int[n];
12         int len = n;
13         while (len > 2) {
14             q[0] = 0;
15             for (int i = 0; i < n; i++) if (tree[i].size() == 1) q[++q[0]] = i;
16             len -= q[0];
17             for (int j = 1; j <= q[0]; j++) {
18                 int a = q[j], b = tree[a].get(0);
19                 tree[a].clear();
20                 for (int i = 0; i < tree[b].size(); i++) {
21                     if (tree[b].get(i) == a) {
22                         tree[b].remove(i);
23                         break;
24                     }
25                 }
26                 valid[a] = 0;
27             }
28         }
29         tree[0].clear();
30         for (int i = 0; i < n; i++) if (valid[i] == 1) tree[0].add(i);
31         return tree[0];
32     }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值