Union Find
难点是怎么知道当前groups是否满足每一个group 的size >= k
搜一遍肯定是不可能的
我已开始非常愚蠢的写了一个TreeMap来记录每一个size的count
然后通过treeMap.firstKey() 来看当前最小的size是什么,跑到60%的时候莫名地有bug,testcase太长了不知道该怎么de
但是显然可以不用这样
看了别人的答案,他们的group count就只记录。。。
卧槽?不对,题意是什么啊。。。。。。。。。。。
等等
我的理解是说只有m个group,每个group最少有k的元素
但是按照别人的方法应该是说,有m个至少有k个元素的group就行了,其他小于k个元素的group不用考虑??
WTF。。。
给lintCode的description跪了
如果按我的理解的话我觉得我写的没错
如果按这个答案的理解就是,只有当size > k的时候,group count ++
private int[] size;
private int[] id;
private int group;
private int k;
public int flowerProblem(int[] flowers, int k, int m) {
int N = flowers.length;
// sizes are zero before blooming
size = new int[N];
id = new int[N];
group = 0;
int lastDay = -1;
this.k = k;
for (int i = 0; i < N; i++) {
id[i] = i;
}
// Try to merge flowers with its previous and next blooming positions
for (int i = 0; i < flowers.length; i++) {
int flower = flowers[i] - 1;
size[flower] = 1;
if (size[flower] >= k) {
group++;
}
if (flower > 0 && size[flower - 1] > 0) {
union(flower, flower - 1);
}
if (flower < N - 1 && size[flower + 1] > 0) {
union(flower, flower + 1);
}
if (group == m) {
lastDay = i + 1;
}
}
return lastDay;
}
private int root(int i) {
while (id[i] != i) {
id[i] = id[id[i]];
i = id[i];
}
return i;
}
private void union(int p, int q) {
int rootP = root(p);
int rootQ = root(q);
if (rootP == rootQ) {
return;
}
int sum = size[rootP] + size[rootQ];
if (sum >= k) {
if (size[rootP] < k && size[rootQ] < k) {
group++;
} else if (size[rootP] >= k && size[rootQ] >= k) {
group--;
}
}
if (size[rootP] < size[rootQ]) {
id[rootP] = rootQ;
size[rootQ] = sum;
} else {
id[rootQ] = rootP;
size[rootP] = sum;
}
}
No comments:
Post a Comment