AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

LeetCode 947. 移除最多的同行或同列石头    原题链接    中等

作者: 作者的头像   Stella-W ,  2020-07-18 12:51:29 ,  阅读 251


0


题目描述

题目求最多的操作次数,每次操作的要求是被选定要移除的石子所在行或者列必须还有其他的石子。采用并查集的思想,如果一个集合可以通过行或者列间接相连,那么存在一种顺序使得某一连通集合中只剩下一个石子。

为了防止行和列出现重复,对于列的值加上一个10000,因为x和y的范围都是10000,因此加上10000保证x和y的数值不会有重叠。然后开始合并能够连通的石子。答案等于 总石子数-集合数量

C++ 代码

class Solution {
public:
    int find(int x)
    {
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
    }

    void uni(int x, int y)
    {
        int a = find(x), b = find(y);
        if (a != b) p[a] = b;
    }

    int p[20000]; // 数值的范围是2000
    unordered_set<int> list;
    int removeStones(vector<vector<int>>& stones) {
        for(int i = 0; i < 20000; i ++) p[i] = i;
        for(int i = 0; i < stones.size(); i ++) uni(stones[i][0],stones[i][1] + 10000);
        for(int i = 0; i < stones.size(); i ++) list.insert(find(stones[i][0]));
        return stones.size() - list.size();
    }
};

1 评论


用户头像
haaai   8个月前     回复

好🔥

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息