https://leetcode.com/problems/pacific-atlantic-water-flow/// 其实,这道题目可以参考前面的那道:Trapping Rain Water II
// 可以看我blog上面的解法:
// http://www.cnblogs.com/charlesblc/p/5920258.html// 注意Java set的操作,retainAll 交集,removeAll差集
// 开始set里面放的是int[],但是发现比较的时候,都被认为不一样,所以需要换成Block// 第一次提交还报了一个Runtime Error,因为没有考虑row或者column为0的情况public class Solution {private class Block {public int row;public int col;public int height;public Block(int r, int c, int h) {row = r;col = c;height = h;}public int hashCode() {return row + col + height;}public boolean equals(Object obj) {if (obj instanceof Block) {Block bk = (Block)obj;return bk.row == row && bk.col == col;}return false;}}public List<int[]> pacificAtlantic(int[][] matrix) {List<int[]> ret = new ArrayList<int[]>();int r = matrix.length;if (r == 0) {return ret;}int c = matrix[0].length;if (c == 0) {return ret;}Set<Block> pSt = new HashSet<Block>();Set<Block> aSt = new HashSet<Block>();Queue<Block> qe = new PriorityQueue<Block>(1,new Comparator<Block>() {@Overridepublic int compare(Block o1, Block o2) {return o1.height - o2.height;}});boolean[][] visited = new boolean[r][c];int[][] dirs = {{-1,0}, {0, 1}, {1, 0}, {0, -1}};for (int i=0; i<r; i++) {Block bk = new Block(i, 0, matrix[i][0]);pSt.add(bk);//System.out.printf("add pset: %d, %d\n", tmp[0], tmp[1]);
            qe.offer(bk);visited[i][0] = true;}for (int i=0; i<c; i++) {Block bk = new Block(0, i, matrix[0][i]);pSt.add(bk);//System.out.printf("add pset: %d, %d\n", tmp[0], tmp[1]);
            qe.offer(bk);visited[0][i] = true;}while (!qe.isEmpty()) {Block bk = qe.poll();for (int i=0; i<4; i++) {int nr = bk.row + dirs[i][0];int nc = bk.col + dirs[i][1];if (nr < 0 || nr >= r || nc < 0 || nc >= c || visited[nr][nc]) {continue;}visited[nr][nc] = true;if (matrix[nr][nc] >= bk.height) {Block nbk = new Block(nr, nc, matrix[nr][nc]);pSt.add(nbk);//System.out.printf("add pset new: %d, %d\n", tmp[0], tmp[1]);
                    qe.offer(nbk);}}}// 重新初始化,计算atlantic
        qe.clear();visited = new boolean[r][c];for (int i=0; i<r; i++) {Block bk = new Block(i, c-1, matrix[i][c-1]);aSt.add(bk);//System.out.printf("add aset: %d, %d\n", tmp[0], tmp[1]);
            qe.offer(bk);visited[i][c-1] = true;}for (int i=0; i<c; i++) {Block bk = new Block(r-1, i, matrix[r-1][i]);aSt.add(bk);//System.out.printf("add aset: %d, %d\n", tmp[0], tmp[1]);
            qe.offer(bk);visited[r-1][i] = true;}while (!qe.isEmpty()) {Block bk = qe.poll();for (int i=0; i<4; i++) {int nr = bk.row + dirs[i][0];int nc = bk.col + dirs[i][1];if (nr < 0 || nr >= r || nc < 0 || nc >= c || visited[nr][nc]) {continue;}visited[nr][nc] = true;if (matrix[nr][nc] >= bk.height) {Block nbk = new Block(nr, nc, matrix[nr][nc]);aSt.add(nbk);//System.out.printf("add aset new: %d, %d\n", tmp[0], tmp[1]);
                    qe.offer(nbk);}}}//System.out.printf("pset length: %d\n", pSt.size());//System.out.printf("aset length: %d\n", aSt.size());
        pSt.retainAll(aSt);System.out.printf("set length: %d\n", pSt.size());Iterator itr = pSt.iterator();while (itr.hasNext()) {Block bk = (Block)itr.next();int[] val = {bk.row, bk.col};ret.add(val);}return ret;}}

pacific-atlantic-water-flow(不错)相关推荐

  1. 【LeetCode】417. Pacific Atlantic Water Flow 太平洋大西洋水流问题

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/pacific- ...

  2. 417 Pacific Atlantic Water Flow 太平洋大西洋水流

    详见:https://leetcode.com/problems/pacific-atlantic-water-flow/description/ C++: class Solution { publ ...

  3. LeetCode Pacific Atlantic Water Flow(flood fill)

    问题:给出一个二维数组,数组中的元素非负.左边和上边表示大平洋,右边和下边表示大西洋.水可以向上下左右四个方向流动,但是要求不高于它.要求输出可以到达两大洋的坐标 思路:因为从高到不高于当前位置的位置 ...

  4. leetcode 417. Pacific Atlantic Water Flow | 417. 太平洋大西洋水流问题(DFS,经典“感染”思路)

    题目 https://leetcode.com/problems/pacific-atlantic-water-flow/ 题解 一开始的错误思路:(区分"主动"与"被动 ...

  5. Pacific Atlantic Water Flow 太平洋大西洋水流问题

    给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的右边界和下边界. 规定水流只能按 ...

  6. Water Flow Optimizer 水流优化器

    物理背景 a为层流,b为湍流. 层流和湍流是流体流动的一种性质.流体流动时,如果流体质点的轨迹(一般说随初始空间坐标x.y.z随时间t而变)是有规则的光滑曲线(最简单的情形是直线),这种流动叫层流,没 ...

  7. 算法细节系列(16):深度优先搜索

    算法细节系列(16):深度优先搜索 详细代码可以fork下Github上leetcode项目,不定期更新. 题目均摘自leetcode: 1. 329 Longest Increasing Path ...

  8. 继续过中等难度.0309

      .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Mediu ...

  9. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

  10. Depth-first Search深度优先搜索专题3

    473. Matchsticks to Square 思路:有n根长度不一的火柴,这些火柴可以拼接在一起,但不能被折断.这些火柴能够围城一个正方形吗?每个火柴可以并且必须使用一次.分析得到每个边的长度 ...

最新文章

  1. CV02-FCN笔记
  2. 一文理解 DDD 领域驱动设计!
  3. 2019计蒜之道 B:个性化评测系统
  4. 什么是云计算基础设施? | 技术头条
  5. asp.net调用js方法小结
  6. OBJECTPROPERTY函数使用
  7. linux怎么修改内存缓存,Linux内存、缓存、Swap等修改
  8. PCB工程师为你详解FPC排线及其用途
  9. ppt thinkcell-Thinkcell: 一款强大的专业图表制作工具
  10. 阿里巴巴2021校招
  11. 回顾过去,展望未来——2014年终总结
  12. web 打印服务器文件,【2人回答】web如何实现客户端打印在线文件(pdf,Word,Excel等),同时可以控制打印设置?-3D溜溜网...
  13. linux字体怪异_Linux默认安装的字体模糊难看
  14. 浏览量比较大的网站应该从哪几个方面入手
  15. 高通8155 GPS HAL层代码移植
  16. InputStream输入字节流
  17. 苹果用户界面Aqua背后的故事
  18. 移动端APP热更新方案(iOS+Android)
  19. Java爬爬之网页去重和代理ip
  20. 示波器表笔旁边的夹子是什么_示波器探头的正确使用方法?

热门文章

  1. 设置Discuz 7论坛游客可以查看图片,但不能下载附件.
  2. app测试过程和重点关注内容
  3. cad插入块_CAD中的quot;块quot;能否修改?能!一个命令可快速解决
  4. mysql 可逆编码,简单明白彻底解决 MySQL 中文编码问题
  5. java 离散算法_用JAVA语言实现离散数学算法
  6. Python 函数(三)
  7. 关于如何学好前端开发,你需要知道的事!
  8. qt 嵌入web页面_Qt嵌入浏览器(二)——QWebChannel实现与页面的通信
  9. python查找指定字符所在行号_在python中获取当前位置所在的行号和函数名
  10. 计算机另一账户无法使用office,关闭Word文档提示: 如何处理另一个应用程序或用户正在使用的文件?...