【LeetCode两题选手】算法类题目(8.3)

题一:岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:

[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]

输出: 1

示例 2:

输入:

[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]

输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvtsnm/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路

不过就是在上次那题“最大岛屿面积”的基础上改成岛屿数量罢了。

代码

int numIslands(vector<vector<char>>& grid) {
        int hen = grid.size();
        if(hen == 0) return 0;
        int shu = grid[0].size();
        int ans = 0;
        for(int i = 0; i < hen; i++){
            for(int j = 0; j < shu; j++){
                if(grid[i][j] == '1'){
                    dfs(grid,i,j);
                    //进入一次dfs就证明有一个岛屿
                    ans++;
                }
            }
        }
        return ans;
    }

    int dfs(vector<vector<char>>& grid,int i,int j){
        if(i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] == '0') return 0;
		//将搜索过的岛屿置为0,避免重复搜索
        grid[i][j] = '0';
        dfs(grid,i + 1,j);
        dfs(grid,i - 1,j);
        dfs(grid,i,j + 1);
        dfs(grid,i,j - 1);
        return 1;
    }

题二:跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvb8zs/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我还以为是回溯的题目,用回溯写了写,发现回溯算法我还不熟。。

思路

很简单,一直以最大步伐前进。虽然浮夸了点。

代码实现

bool canJump(vector<int>& nums) {
        int reach = 0;
        int n = nums.size();
        for(int i = 0;i < n;i++){
            // 当i大于前面最大能到达的位置,即走到0的后面了,这时退出
            if(reach >= n-1 || i > reach) break;
            reach = max(reach,i+nums[i]);
        }
        return reach >= n-1;
    }

猜你喜欢

转载自blog.csdn.net/qq_43762191/article/details/107763989