秋招力扣Hot100刷题总结——贪心&图论

贪心

1. 买卖股票的最佳时机 题目链接

  • 题目要求:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
    你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
    返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
    在这里插入图片描述
  • 代码及思路
    • 使用贪心算法,局部最优求全局最优
    • 假设在第一天就买入股票,然后从第二天开始每天用当天的价格计算利润更新最大利润
    • 在遍历过程中,以更低的价格更新买入股票价格
    • 代码
class Solution {
    public int maxProfit(int[] prices) {
        int buy=prices[0];
        int maxValue=0;
        for(int i=1;i<prices.length;i++){
            maxValue=Math.max(maxValue,prices[i]-buy);
            if(prices[i]<buy){
                buy=prices[i];
            }
        }
        return maxValue;
    }
}

2. 最大子数组和 题目链接

  • 题目要求:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
    子数组是数组中的一个连续部分。
    在这里插入图片描述
  • 代码及思路
    • 使用贪心算法来解决,遍历数组求和,当sum大于0时sum对后面子数组的贡献为正,可以继续求和;当sum小于0时对后面的子数组贡献是负的,因此sum重新开始
    • 每次使用sum和当前最大和res比较,更新res
    • 代码
class Solution {
    public int maxSubArray(int[] nums) {
        int res=Integer.MIN_VALUE;
        int sum=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
            res=Math.max(res,sum);
            if(sum<0){
                sum=0;
            }
        }
        return res;
    }
}

图论

1. 岛屿数量 题目链接

  • 题目要求:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
    岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
    此外,你可以假设该网格的四条边均被水包围。
    在这里插入图片描述
  • 代码及思路
    • 本题使用深度遍历的方式计算岛屿数量
    • 遍历网格,碰到一个为‘1’的网格则岛屿数量加1
    • 然后从四个方向上进行深度遍历,将遇到的所有的为‘1’的网格变成‘0’,直到遇到不是‘1’的网格
    • 代码
class Solution {
    public int numIslands(char[][] grid) {
       int res=0;
       for(int i=0;i<grid.length;i++){
        for(int j=0;j<grid[0].length;j++){
            if(grid[i][j]=='1'){
                res++;
                dfs(grid,i,j);
            }
        }
       }
       return res;
    }
    private void dfs(char[][] grid,int i,int j){
        if(i<0||i>=grid.length||j<0||j>=grid[0].length||grid[i][j]!='1')return;
        grid[i][j]='0';
        dfs(grid,i-1,j);
        dfs(grid,i+1,j);
        dfs(grid,i,j-1);
        dfs(grid,i,j+1);
    }
}

2.单词搜索 题目链接

  • 题目要求:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
    单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
    在这里插入图片描述
  • 代码及思路
    • 使用深度优先遍历的方式解决问题,也可以使用广度优先遍历
    • 对board中每一个字符遍历,从该字符开始深度优先寻找word
    • 注意遍历结束条件
    • 代码
class Solution {
    public boolean exist(char[][] board, String word) {
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length;j++){
                if(dfs(board,i,j,word,0)){
                    return true;
                }
            }
        }
        return false;
    }
    private boolean dfs(char[][] board,int i,int j,String word,int k){
        if(k==word.length())return true;
        if(i<0||i>=board.length||j<0||j>=board[0].length||board[i][j]!=word.charAt(k))return false;
        board[i][j]='\0';
        boolean flag=dfs(board,i+1,j,word,k+1)||dfs(board,i-1,j,word,k+1)||dfs(board,i,j+1,word,k+1)||dfs(board,i,j-1,word,k+1);
        board[i][j]=word.charAt(k);
        return flag;
    }   
}
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值