pass by reference & pass by value 记一次莫名其妙的超时

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

11110
11010
11000
00000

Answer: 1

Example 2:

11000
11000
00100
00011

Answer: 3


这道题,最开始我的dfs函数如下 :

void dfs(const vector<vector<char>> grid,bool** visited, int x, int y) {
        int row = grid.size(), col = grid[0].size();
        if (x < 0 || x >= row || y < 0 || y >= col)
            return;
        if (visited[x][y])
            return;
        if (grid[x][y] == '0')
            return;
        visited[x][y] = 1;
        dfs(grid,visited,x+1,y);
        dfs(grid,visited,x-1,y);
        dfs(grid,visited,x,y+1);
        dfs(grid,visited,x,y-1);
    }


我对照着网上其他人的答案,对比了半天也没找出来到底为什么超时…最后我发现错误出现在对参数的传递上,当我把第一行改为 

void dfs(const vector<vector<char>> &grid,bool** visited, int x, int y) 

测试通过了。

如果不使用pass by reference 而是pass by value 的话,每次dfs,系统都要复制一个相同大小的矩阵grid,传给下一个递归函数。在极端数据的测试下,每次复制都会耗费相当多的时间,所以超时。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值