LeetCode 947. Most Stones Removed with Same Row or Column
原题链接在这里:https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/
题目:
On a 2D plane, we place stones at some integer coordinate points. Each coordinate point may have at most one stone.
Now, a move consists of removing a stone that shares a column or row with another stone on the grid.
What is the largest possible number of moves we can make?
Example 1:
- Input: stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
- Output: 5
Example 2:
- Input: stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
- Output: 3
Example 3:
- Input: stones = [[0,0]]
- Output: 0
Note:
1 <= stones.length <= 1000
0 <= stones[i][j] < 10000
题解:
The number of most stones removed = stones count - unions count
If a stone in on a row or column same as other stone, then two stones are in the same union.
Use two HashMap to maintain row and column to stone index relationship. If the key already exist, then there is previous stone with same row or column existing already.
Find parents of two stones, if they are not equal, then union.
Time Complexity: O(nlogn). find takes O(logn). Since use path compression and union by size, amortize O(1).
Space: O(n).
AC Java:
- class Solution {
- Map<Integer, Integer> row = new HashMap<>();
- Map<Integer, Integer> colum = new HashMap<>();
- int [] parent;
- int [] size;
- public int removeStones(int[][] stones) {
- int n = stones.length;
- parent = new int[n];
- size = new int[n];
- for(int i = 0; i<n; i++){
- parent[i] = i;
- size[i] = 1;
- }
- int count = n;
- for(int i = 0; i<n; i++){
- int [] stone = stones[i];
- if(!row.containsKey(stone[0])){
- row.put(stone[0], i);
- }else{
- int p = row.get(stone[0]);
- if(!find(i, p)){
- union(i, p);
- count--;
- }
- }
- if(!colum.containsKey(stone[1])){
- colum.put(stone[1], i);
- }else{
- int p = colum.get(stone[1]);
- if(!find(i, p)){
- union(i, p);
- count--;
- }
- }
- }
- return n - count;
- }
- private boolean find(int i, int j){
- return root(i) == root(j);
- }
- private int root(int i){
- while(i != parent[i]){
- parent[i] = parent[parent[i]];
- i = parent[i];
- }
- return i;
- }
- private void union(int i, int j){
- int p = root(i);
- int q = root(j);
- if(size[p] > size[q]){
- parent[q] = p;
- size[p] += size[q];
- }else{
- parent[p] = q;
- size[q] += size[p];
- }
- }
- }
LeetCode 947. Most Stones Removed with Same Row or Column的更多相关文章
- 【LeetCode】947. Most Stones Removed with Same Row or Column 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 并查集 日期 题目地址:https://leetco ...
- 【leetcode】947. Most Stones Removed with Same Row or Column
题目如下: On a 2D plane, we place stones at some integer coordinate points. Each coordinate point may h ...
- Leetcode: Most Stones Removed with Same Row or Column
On a 2D plane, we place stones at some integer coordinate points. Each coordinate point may have at ...
- [Swift]LeetCode947. 移除最多的同行或同列石头 | Most Stones Removed with Same Row or Column
On a 2D plane, we place stones at some integer coordinate points. Each coordinate point may have at ...
- Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.
1: /// <summary> 2: /// Write an algorithm such that if an element in an MxN matrix is 0, it ...
- excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1
编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...
- Flutter 布局(七)- Row、Column详解
本文主要介绍Flutter布局中的Row.Column控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Row A widget that displays its children ...
- params.row[params.column.key] vue h函数 当前单元格 h函数 div 属性 值或数组 render
params.row[params.column.key] vue h函数 当前单元格 h函数 div 属性 值或数组 render
- Flutter 布局类组件:线性布局(Row和Column)
前言 所谓线性布局,即指沿水平或垂直方向排布子组件.Flutter中通过Row和Column来实现线性布局,并且它们都继承自弹性布局(Flex). 接口描述 Row({ Key key, // 表示子 ...
随机推荐
- 嵌入式02 STM32 实验10 定时器中断
优秀文章 https://blog.csdn.net/qq_38351824/article/details/82619734 一.STM32通用定时器(TIM2.TIM3.TIM4和TIM5共四个通 ...
- c++11多线程记录1 -- std::thread
启动一个线程 话不多说,直接上代码 void func(); int main() { std::thread t(func); //这里就开始启动线程了 t.join(); // 必须调用join或 ...
- day50——js补充
day50 前端内容回顾 HTML 标签分类 块级标签:div p h1-h6 form hr br ul li ol table标签 内联标签:span a img label input sele ...
- Vue框架——页面组件中使用小组件
小组件在components文件夹中,页面组件在views文件夹中 一.先写小组件的vue,比如text.vue(在template设置模板渲染,style设置样式) <template> ...
- LeetCode 5214. 最长定差子序列(Java)HashMap
题目: 5214. 最长定差子序列 给你一个整数数组 arr 和一个整数 difference,请你找出 arr 中所有相邻元素之间的差等于给定 difference 的等差子序列,并返回其中最长的等 ...
- AVR单片机教程——旋转编码器
好久没写这个系列了.今天讲讲旋转编码器. 旋转编码器好像不是单片机玩家很常用的器件,但是我们的开发板上有,原因如下: 旋转编码器挺好用的.电位器能旋转的角度有限,旋转编码器可以无限圈旋转:旋转时不连续 ...
- gym101480
A. ASCII Addition 模拟 #include <iostream> #include <sstream> #include <algorithm> # ...
- git 学习笔记 --Bug分支
软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...
- 记一次node爬虫经历,手把手教你爬虫
今天业务突然来了个爬虫业务,爬出来的数据以Excel的形式导出,下班前一个小时开始做,加班一个小时就做好了.因为太久没做爬虫了!做这个需求都是很兴奋! 需求说明 访问网站 (循环)获取页面指定数据源 ...
- 关于elasticsearch使用G1垃圾回收替换CMS
最近ES集群数据节点经常出现jvm占用过高,频繁GC导致ES集群卡死,很长时间才恢复.在网上看到用G1垃圾回收可以改善这一情况,但都是老版本的ES,我们现在使用的版本是5.5.2,所以想问问各位5.5 ...