Crack LeetCode 之 200. Number of Islands

https://leetcode.com/problems/number-of-islands/

本题解法的巧妙之处在于,把含有1的岛合并,这样只要统计1的个数就能知道有多少个岛。另外,本解法直接在传入的gird中保存合并结果,也节约了内存。以下为C++和python的代码,时间复杂度为O(m*n),空间复杂度为O(1)。

struct Solution {
    int numIslands(vector<vector<char>>& grid) {
		if(grid.empty() || grid[0].empty())
			return 0;

		int count=0;
		int m = grid.size();
		int n = grid[0].size();
		for(int i=0; i<m; i++){
			for(int j=0; j<n; j++){
				if(grid[i][j]=='1'){
					count++;
					merge(grid, i, j);
				}
			}
		}

		return count;
	}

	void merge(vector<vector<char>>& grid, int i, int j){
		int m=grid.size();
		int n=grid[0].size();
		if(i<0 || i>=m || j<0 || j>=n || grid[i][j]!='1')
			return;
 
		grid[i][j]='X';
		merge(grid, i-1, j);
		merge(grid, i+1, j);
		merge(grid, i, j-1);
		merge(grid, i, j+1);
	}
};
class Solution:
    def numIslands(self, grid):
        if grid == None or len(grid) == 0 or grid[0] == None:
            return 0

        count = 0
        m = len(grid)
        n = len(grid[0])
        for i in range(m):
            for j in range(n):
                if grid[i][j] == '1':
                    count = count + 1
                    self.merge( grid, i, j )

        return count

    def merge(self, grid, i, j):
        if grid == None or grid[0] == None:
            return

        m = len(grid)
        n = len(grid[0])
        if i < 0 or i >= m or j < 0 or j >= n or grid[i][j] != '1':
            return

        grid[i][j] = 'X'
        self.merge(grid, i-1, j)
        self.merge(grid, i+1, j)
        self.merge(grid, i, j-1)
        self.merge(grid, i, j+1)

猜你喜欢

转载自blog.csdn.net/tassardge/article/details/85212583