[路飞] 移除最多的同行或同列石头

147 阅读1分钟

记录 1 道算法题

移除最多的同行或同列石头

leetcode-cn.com/problems/mo…


要求:放一个石头的时候,如果有跟他在同一行或同一列的石头,则移除与他同行或同列的那个石头。需要得出最大的移除数量。

要得到最大的移除数量说明需要将石头串起来放,像贪吃蛇的形状,放一个拿一个,所以需要得出相连的石头有多少个。集合问题可以用并查集解决,问的是可以移除最多的石头,那就是除了单独的石头的集合之外,其他有两个以上的石头的集合都是符合的,所以只需要计算有多少个单独的石头的集合就可以了。还有每个集合都会剩最后一个石头不会被移除。所以比较好的做法是当产生连接时消除那个石头/集合,即 -1。

因为是坐标系,所以肯定会出现 x 与 y 重复的情况,所以要额外进行区分。因为坐标系是 10的4次方大小,所以 x = x + 10001。额外处理 y 也行,只要处理一个就行。

采用相同的行或相同的列为一个集合。

    function removeStones(stones) {
        const parent = {}
        let count = 0

        for(let i = 0; i < stones.length; i++) {
            let [x, y] = stones[i]
            x = x + 10001
            // 记录单独的集合
            if (parent[x] === undefined) {
                parent[x] = x
                count++
            }
            // 记录单独的集合
            if (parent[y] === undefined) {
                parent[y] = y
                count++
            }
            
            // 如果两个集合可以连接,就消去一个石头
            const a = find(parent, x)
            const b = find(parent, y)
            if (a === b) continue
            parent[b] = a
            count--
        }

        return stones.length - count
    }
    
    function find(parent, i) {
        if (parent[i] !== i) {
            parent[i] = find(parent, parent[i])
        }

        return parent[i]
    }

结束