leetcode827. 最大人工岛

 题目来源:827. 最大人工岛 - 力扣(LeetCode)

思路比较简单,用dfs,一开始超时了,只能通过69/75,后面做了一些优化,仅仅只在海岸线进行深搜,并且深搜完毕得出岛屿面积后,在原来海岸线位置上再次深搜进行岛屿还原。

执行用时:1240 ms, 在所有 C 提交中击败了6.00%的用户

内存消耗:19.6 MB, 在所有 C 提交中击败了94.00%的用户

C语言代码如下:

int max;

static void dfs(int** grid, int gridSize, int* gridColSize, int * area, int row, int col)
{
    bool flag = false;
    //right
    if (col < *gridColSize - 1 && grid[row][col + 1] == 1) {
        flag = true;
        (*area)++;
        grid[row][col + 1] = 2;
        dfs(grid, gridSize, gridColSize, area, row, col + 1);
    }
    //down
    if (row < gridSize - 1 && grid[row + 1][col] == 1) {
        flag = true;
        (*area)++;
        grid[row + 1][col] = 2;
        dfs(grid, gridSize, gridColSize, area, row + 1, col);
    }
    //left
    if (col > 0 && grid[row][col - 1] == 1) {
        flag = true;
        (*area)++;
        grid[row][col - 1] = 2;
        dfs(grid, gridSize, gridColSize, area, row, col - 1);
    }
    //up
    if (row > 0 && grid[row - 1][col] == 1) {
        flag = true;
        (*area)++;
        grid[row - 1][col] = 2;
        dfs(grid, gridSize, gridColSize, area, row - 1, col);
    }
    if (!flag) {
        max = fmax(max, *area);
    }
}

static void func(int** grid, int gridSize, int* gridColSize, int row, int col)
{
    //right
    if (col < *gridColSize - 1 && grid[row][col + 1] == 2) {
        grid[row][col + 1] = 1;
        func(grid, gridSize, gridColSize, row, col + 1);
    }
    //down
    if (row < gridSize - 1 && grid[row + 1][col] == 2) {
        grid[row + 1][col] = 1;
        func(grid, gridSize, gridColSize, row + 1, col);
    }
    //left
    if (col > 0 && grid[row][col - 1] == 2) {
        grid[row][col - 1] = 1;
        func(grid, gridSize, gridColSize, row, col - 1);
    }
    //up
    if (row > 0 && grid[row - 1][col] == 2) {
        grid[row - 1][col] = 1;
        func(grid, gridSize, gridColSize, row - 1, col);
    }
}

int largestIsland(int** grid, int gridSize, int* gridColSize)
{
    bool flag = false;
    max = 1;
    for (int row = 0; row < gridSize; row++) {
        for (int col = 0; col < *gridColSize; col++) {
            if (grid[row][col] == 0) {
                flag = true;
                if ((row > 0 && grid[row - 1][col]) 
                 || (col < *gridColSize - 1 && grid[row][col + 1])
                 || (row < gridSize - 1 && grid[row + 1][col])
                 || (col > 0 && grid[row][col - 1])) {
                    int area = 1;
                    dfs(grid, gridSize, gridColSize, &area, row, col);
                    func(grid, gridSize, gridColSize, row, col);
                }
            }
        }
    }
    return (flag ? max : (*gridColSize * gridSize));
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值