Lintcode: 不同岛屿的个数

问题:

给定一个由0和1组成的非空的二维网格,一个岛屿是指四个方向(包括横向和纵向)都相连的一组1(1表示陆地)。你可以假设网格的四个边缘都被水包围。

找出所有不同的岛屿的个数。如果一个岛屿与另一个岛屿形状相同(不考虑旋转和翻折),我们认为这两个岛屿是相同的。

注意:

11
1

 1
11

是不同的岛屿,因为我们不考虑旋转和翻折。

样例

样例 1:

输入:
  [
    [1,1,0,0,1],
    [1,0,0,0,0],
    [1,1,0,0,1],
    [0,1,0,1,1]
  ]
输出: 3
解释: 
  11   1    1
  1        11   
  11
   1  

样例 2:

输入: 
  [
    [1,1,0,0,0],
    [1,1,0,0,0],
    [0,0,0,1,1],
    [0,0,0,1,1]
  ]
输出: 1

注意事项

网格的每一个维度的长度都不超过50

python:

class Solution:
    """
    @param grid: a list of lists of integers
    @return: return an integer, denote the number of distinct islands
    """
    def changeToFalse(self, grid, m, n, mMin, mMax, nMin, nMax):
        if m < 0 or m >= len(grid) or n < 0 or n >= len(grid[0]):
            return
        if grid[m][n] == 1:
            grid[m][n] = 2
            Mmin = min(m, mMin[0])
            del mMin[0]
            mMin.append(Mmin)
            Mmax = max(m, mMax[0])
            del mMax[0]
            mMax.append(Mmax)
            Nmin = min(n, nMin[0])
            del nMin[0]
            nMin.append(Nmin)
            Nmax = max(n, nMax[0])
            del nMax[0]
            nMax.append(Nmax)
            self.changeToFalse(grid, m-1, n, mMin, mMax, nMin, nMax)
            self.changeToFalse(grid, m+1, n, mMin, mMax, nMin, nMax)
            self.changeToFalse(grid, m, n-1, mMin, mMax, nMin, nMax)
            self.changeToFalse(grid, m, n+1, mMin, mMax, nMin, nMax)
    def numberofDistinctIslands(self, grid):
        # write your code here
        if len(grid) == 0 or len(grid[0]) == 0:
            return 0
        resultStr = []
        for i in range(len(grid)):
            for j in range(len(grid[i])):
                if grid[i][j] == 1:
                    mMin = []
                    mMin.append(i)
                    mMax = []
                    mMax.append(i)
                    nMin = []
                    nMin.append(j)
                    nMax = []
                    nMax.append(j)
                    self.changeToFalse(grid, i, j, mMin, mMax, nMin, nMax)
                    temp = ""
                    flag = False
                    for p in range(mMin[0], mMax[0]+1, 1):
                        for q in range(nMin[0], nMax[0]+1, 1):
                            temp = temp + str(grid[p][q])
                        temp += "_"
                    if len(resultStr) == 0:
                        resultStr.append(temp)
                    else:
                        for index in range(len(resultStr)):
                            if resultStr[index] == temp:
                                flag = True
                                break
                        if flag == False:
                            resultStr.append(temp)
        return len(resultStr)

C++:

class Solution {
public:
    /**
     * @param grid: a list of lists of integers
     * @return: return an integer, denote the number of distinct islands
     */
    void changeToFalse(vector<vector<int>> &grid, int m, int n, int &mMin, int &mMax, int &nMin, int &nMax)
    {
    	if (m < 0 || m >= grid.size() || n < 0 || n >= grid[0].size())
    	{
    		return;
    	}
    	if (grid[m][n] == 1)
    	{
    		grid[m][n] = 2;
    		mMin = min(m, mMin);
    		mMax = max(m, mMax);
    		nMin = min(n, nMin);
    		nMax = max(n, nMax);
    		changeToFalse(grid, m - 1, n, mMin, mMax, nMin, nMax);
    		changeToFalse(grid, m + 1, n, mMin, mMax, nMin, nMax);
    		changeToFalse(grid, m, n - 1, mMin, mMax, nMin, nMax);
    		changeToFalse(grid, m, n + 1, mMin, mMax, nMin, nMax);
    	}
    }
    int numberofDistinctIslands(vector<vector<int>> &grid) {
    	// write your code here
    	if (grid.size() == 0 || grid[0].size() == 0)
    	{
    		return 0;
    	}
    	
    	vector<string> resultStr;
    	for (int i = 0; i < grid.size(); i++)
    	{
    		for (int j = 0; j < grid[i].size(); j++)
    		{
    			if (grid[i][j] == 1)
    			{
    				int mMin = i;
    				int mMax = i;
    				int nMin = j;
    				int nMax = j;

    				changeToFalse(grid, i, j, mMin, mMax, nMin, nMax);
    				string temp = "";
    				bool flag = false;
    				for (int p = mMin; p <= mMax; p++)
    				{
    					for (int q = nMin; q <= nMax; q++)
    					{
    						temp = temp + to_string(grid[p][q]);
    					}
    					temp += "_";
    				}
    				if (resultStr.empty())
    				{
    					resultStr.push_back(temp);
    				}
    				else {
    					for (int index = 0; index < resultStr.size(); index++)
    					{
    						if (resultStr[index] == temp)
    						{
    							flag = true;
    							break;
    						}
    					}
    					if (flag == false)
    					{
    						resultStr.push_back(temp);
    					}
    				}
    
    			}
    		}
    	}
    	return resultStr.size();
    }
};

PS:python之所以复杂一点是因为传参问题,如果能简化请告知

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值