94 移除最多的同行或同列石头
作者:
晚于: 2020-09-09 12:00:00后提交分数乘系数50%
问题描述 :
我们将石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。
每次 move 操作都会移除一块所在行或者列上有其他石头存在的石头。
请你设计一个算法,计算最多能执行多少次 move 操作?
示例 1:
输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
输出:5
示例 2:
输入:stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
输出:3
示例 3:
输入:stones = [[0,0]]
输出:0
输入说明 :
首先输入石头的数量n,
然后输入n行,每行一个坐标x、y,x和y之间以空格分隔。
1 <= n <= 1000
0 <= x,y < 10000
输出说明 :
输出一个整数
输入范例 :
输出范例 :
#include <iostream> #include <vector> #include <unordered_set> using namespace std; //同一行或同一列有其他石头才能移除 class Solution { public: int f[20000]; unordered_set<int> list; int removeStones(vector<vector<int>>& stones) { for(int i=0;i<20000;i++) f[i]=i; for(int i=0;i<stones.size();i++) union_ij(stones[i][0],stones[i][1]+10000); for(int i=0;i<stones.size();i++) { // cout<<"insert:"<<" "<<find(stones[i][0]); list.insert(find(stones[i][0])); } return stones.size()-list.size(); } int find(int x) { if(x!=f[x]) return f[x]=find(f[x]); else return x; } void union_ij(int x,int y) { int fx=find(x); int fy=find(y); // cout<<"x:"<<" "<<fx<<endl; // cout<<"y:"<<" "<<fy<<endl; if(fx!=fy) f[fx]=fy; } }; int main() { int n,temp; cin>>n; vector<vector<int>> stones; for(int i=0;i<n;i++) { vector<int> row; for(int j=0;j<2;j++) { cin>>temp; row.push_back(temp); } stones.push_back(row); } int res=Solution().removeStones(stones); cout<<res; }
posted on 2020-09-15 21:08 Hi!Superman 阅读(203) 评论(0) 编辑 收藏 举报