My Algorithm Summary
  • Introduction
  • Data Structure
    • Linked List
    • Stack
      • Monotone Stack
        • 42 Trapping Rain Water
        • 84 Largest Rectangle in Histogram
        • 85 Maximal Rectangle
        • 255 Verify Preorder Sequence in Binary Search Tree
        • 316 Remove Duplicate Characters
        • 402 Remove K Digits
        • 456 132 Pattern
        • 496 Next Greater Element I
        • 503 Next Greater Element II
      • 20 Valid Parentheses
      • 71 Simplify Path
      • 150 Evaluate Reverse Polish Notation
      • 155 Min Stack
      • 173 Binary Search Tree Iterator
      • 224 Basic Calculator
      • 227 Basic Calculator II
      • 232 Implement Queue using Stacks
      • 341 Flatten Nested List Iterator
      • 394 Decode String
      • 439 Ternary Expression Parser
      • 636 Exclusive Time of Functions
    • Heap
    • Trie
    • Segment Tree
    • Tree
      • 94 Binary Tree Inorder Traversal
      • 104 Maximum Depth of Binary Tree
      • 144 Binary Tree Preorder Traversal
      • 145 Binary Tree Postorder Traversal
      • 199 Binary Tree Right Side View
      • 226 Invert Binary Tree
      • 272 Closest Binary Search Tree Value II
      • 508 Most Frequent Subtree Sum
      • 513 Find Bottom Left Tree Value
      • 515 Find Largest Value in Each Tree Row
      • 617 Merge Two Binary Trees
      • 637 Average of Levels in Binary Tree
      • 653 Two Sum IV - Input is a BST
      • 654 Maximum Binary Tree
      • 669 Trim a Binary Search Tree
      • 666 Path Sum IV
      • 230 Kth Smallest Element in a BST
      • 250 Count Univalue Subtrees
      • 538 Convert BST to Greater Tree
      • 404 Sum of Left Leaves
      • 582 Kill Process
      • 112 Path Sum
      • 108 Convert Sorted Array to Binary Search Tree
      • 111 Minimum Depth of Binary Tree
      • 501 Find Mode in Binary Search Tree
      • 102 Binary Tree Level Order Traversal
      • 107 Binary Tree Level Order Traversal II
      • 103 Binary Tree Zigzag Level Order Traversal
      • 113 Path Sum II
      • 437 Path Sum III
      • 99 Recover Binary Search Tree
      • 687 Longest Univalue Path
      • 285 Inorder Successor in BST
      • 101 Symmetric Tree
      • 129 Sum Root to Leaf Numbers
      • 298 Binary Tree Longest Consecutive Sequence
      • 270 Closest Binary Search Tree Value
      • 549 Binary Tree Longest Consecutive Sequence II
      • 98 Validate Binary Search Tree
      • 652 Find Duplicate Subtrees
      • 314 Binary Tree Vertical Order Traversal
      • 333 Largest BST Subtree
      • 563 Binary Tree Tilt
      • 110 Balanced Binary Tree
    • Graph
      • Detect Cycle
  • Algorithms
    • Union Find
      • 695 Max Area of Island
      • 684 Redundant Connection
    • Binary Search
    • Topological Sorting
    • Breadth-First Search
      • 694 Number of Distinct Islands
    • Depth-First Search
    • Two Pointers
    • Sorting
    • Backtacking
    • Dynamic Programming
      • Interval DP
        • Matrix Chain Multiplication
        • Merge Stone
      • KnapSack Problem
        • 0-1 KnapSack
        • Unbounded KnapSack
      • Longest Increasing Subsequence
      • Longest Common Subsequence
    • Reservior Sampling
    • Bipartite Graph
      • Check Bipartite Graph
      • Maximal Matching - Hungarian Algorithm
    • String Pattern Matching
      • KMP Algorithm
      • Rabin Karp Algorithm
  • System Design
    • Consistent Hashing
    • Bloom Filter
    • Caching
      • LRU
      • LFU
    • Mini Twitter
    • Tiny Url
Powered by GitBook
On this page
  • 694. Number of Distinct Islands
  • 1. 题目:
  • 2. 思路
  • 3. Implementation

Was this helpful?

  1. Algorithms
  2. Breadth-First Search

694 Number of Distinct Islands

PreviousBreadth-First SearchNextDepth-First Search

Last updated 5 years ago

Was this helpful?

694.

1. 题目:

Given a non-empty 2D arraygridof 0's and 1's, an island is a group of1'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

are considered different island shapes, because we do not consider reflection / rotation.

Note:The length of each dimension in the given grid does not exceed 50.

2. 思路

这题的难点在于如何表示island形状的唯一性,这里我们的方法是用一个List of List存储每个值为1的点与起始点的相对距离 {row, col}, 然后再把这个List of List放到Hashset里判断唯一性, 最后得到的Hashset的size就是我们要求的不同形状的岛屿的个数。时间复杂度和空间复杂度都为O(mn)

3. Implementation

class Solution {
    public int numDistinctIslands(int[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }

        int m = grid.length, n = grid[0].length;
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

        Set<List<List<Integer>>> set = new HashSet<>();

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    List<List<Integer>> hashKey = new ArrayList<>();
                    searchByBFS(i, j, directions, grid, hashKey);
                    set.add(hashKey);
                }
            }
        }
        return set.size();
    }

    public void searchByBFS(int row, int col, int[][] directions, int[][] grid, List<List<Integer>> hashKey) {
        grid[row][col] = 0;
        Queue<Integer> queue = new LinkedList<>();
        int n = grid[0].length;

        queue.add(row * n + col);

        while (!queue.isEmpty()) {
            int curPoint = queue.remove();
            int curRow = curPoint / n;
            int curCol = curPoint % n;

            for (int i = 0; i < 4; i++) {
                int nextRow = curRow + directions[i][0];
                int nextCol = curCol + directions[i][1];

                if (isValid(nextRow, nextCol, grid)) {
                    grid[nextRow][nextCol] = 0;
                    hashKey.add(Arrays.asList(nextRow - row, nextCol - col));
                    queue.add(nextRow * n + nextCol);
                }
            }
        }
    } 

    public boolean isValid(int row, int col, int[][] grid) {
        return row >= 0 && row < grid.length &&  col >= 0 && col < grid[0].length && grid[row][col] == 1;
    }
}
Number of Distinct Islands