Friday, December 7, 2018

1555. Flower Problem

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