标签:stones parent merge int 查集 石头 同列 移除 find
/** * n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。 给你一个长度为 n 的数组 stones ,其中 stones[i] = [xi, yi] 表示第 i 块石头的位置,返回 可以移除的石子 的最大数量。 */ //思路,并查集 public class test947 { //输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]] 5 public static void main(String[] args) { int [][]stones={{0,0},{0,1},{1,0},{1,2},{2,1},{2,2}}; int x=removeStones(stones); } public static int removeStones(int[][] stones) { if(stones.length==1){ return 0; } int n=stones.length; int []parents=new int[stones.length]; for(int i=0;i<n;i++){ parents[i]=i; } int res=n; for(int i=0;i<n-1;i++){ for(int j=i+1;j<n;j++){ int a=find(parents, i); int b=find(parents, j); if(stones[i][0]==stones[j][0]||stones[i][1]==stones[j][1]){ if(a!=b){ parents[a]=b; res--; } } } } return n-res; } public static int find(int []parent,int i){ if(parent[i]!=i){ parent[i]=find(parent,parent[i]); } return parent[i]; } }
对于并查集,一般的模板是这样
// 未改进版本 class Djset { public: vector<int> parent; // 记录节点的根 Djset(int n): parent(vector<int>(n)) { for (int i = 0; i < n; i++) parent[i] = i; } int find(int x) { if (x != parent[x]) return find(parent[x]); return parent[x]; } void merge(int x, int y) { int rootx = find(x); int rooty = find(y);
//这个merge的地方写merge逻辑,例如对于移出同行同列石头,就是如果行或者列相同,如果a!=b,也就是之前没合并,则合并,每次合并剩下的并查集个数-1
//对于字符串交换排序,直接merge之后,遍历所有元素,将key取出来做 map的key,value用排序队列,每次拿出来每个key的从小到大
parent[rooty] = rootx; } };
要特别注意维护的parent里面是索引下标
标签:stones,parent,merge,int,查集,石头,同列,移除,find 来源: https://www.cnblogs.com/jieyi/p/14284668.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。