zoukankan      html  css  js  c++  java
  • 694. Number of Distinct Islands 694.独立岛屿数

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.

    Count the number of distinct islands. An island is considered to be the same as another if and only if one island can be translated (and not rotated or reflected) to equal the other.

    Example 1:

    11000
    11000
    00011
    00011
    

    Given the above grid map, return 1.

     

    Example 2:

    11011
    10000
    00001
    11011

    Given the above grid map, return 3.

    Notice that:

    11
    1
    

    and

     1
    11

    思路:只要加一句条件,统一判断岛的x y是否超出边界就行了。不需要每个点都判断一遍

    通用的思路:基础点要是1才行,统计之后记为0

    数岛的面积一般返回int

    用set消除重复性:同一个点去扩散不能有重复,开一个set。所有点去扩散,遍地开花,再开一个set

    现有坐标和基础坐标有区别:参数里还要加个baseX, baseY

    class Solution {
        public int numDistinctIslands(int[][] grid) {
            //cc
            if (grid == null || grid.length == 0 || grid[0].length == 0) 
                return 0;
            
            Set<String> result = new HashSet<>();
            
            for (int i = 0; i < grid.length; i++) {
                for (int j = 0; j < grid[0].length; j++) {
                    if (grid[i][j] == 1) {
                        Set<String> set = new HashSet<>();
                        dfs(grid, i, j, i, j, set);
                        result.add(set.toString());
                    }
                }
            }
            
            return result.size();
        }
        
        public int dfs(int[][] grid, int i, int j, int baseX, int baseY, 
                      Set<String> set) {
            //cc
            if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length)
                return 0;
            
            if (grid[i][j] == 1) {
                String distanceString = String.valueOf(i - baseX) + "_" + String.valueOf(j - baseY);
                set.add(distanceString);
                
                grid[i][j] = 0;
                dfs(grid, i + 1, j, baseX, baseY, set);
                dfs(grid, i - 1, j, baseX, baseY, set);
                dfs(grid, i, j + 1, baseX, baseY, set);
                dfs(grid, i, j - 1, baseX, baseY, set);
            }
            
            return set.size();
        }
    }
    View Code
    
    
    


  • 相关阅读:
    C++窗体应用程序
    C++继承方式简介及公有继承
    C++(继承的基本概念和语法)
    python(12)---科赫特雪花
    python(11)---pyinstaller
    20200914 day9 数据结构复习(一)
    20200914 day9 刷题记录
    20200913 day8模拟(二)
    20200912 day7 刷题记录
    20200912 day7 图论复习(一)
  • 原文地址:https://www.cnblogs.com/immiao0319/p/13253728.html
Copyright © 2011-2022 走看看