每日5题Day9 - LeetCode 41 - 45

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!

第一题:41. 缺失的第一个正数 - 力扣(LeetCode)

今天这道题没有ac,写不动了,下次再通过吧,先给个半成品下次回来改掉

java 复制代码
class Solution {
    public int firstMissingPositive(int[] nums) {
        //使用掩码来做吧,通过$与|来记录一下各个数是否有出现
        int mask = 0;
        int n = nums.length;
        // 将正整数放置到对应的位置
        for (int num : nums) {
            if (num > 0 && num <= n) {
                mask |= (1 << (num - 1));
            }
        }
        // 找到第一个缺失的正整数
        for (int i = 0; i < n; i++) {
            if ((mask & (1 << i)) == 0) {
                return i + 1;
            }
        }
        // 如果数组中包含了1到n之间的所有正整数,则缺失的是n+1
        return n + 1;
    }
}

第二题:42. 接雨水 - 力扣(LeetCode)

java 复制代码
class Solution {
    public int trap(int[] height) {
        //单调站的传统题
        Deque<Integer> deque = new ArrayDeque<>();
        int res = 0;
        for(int i = 0; i < height.length; i++){
            while(!deque.isEmpty() && height[i] > height[deque.peekLast()]){
                int tmp = deque.pollLast();
                if(!deque.isEmpty()){
                    //注意宽和高是如何得到的
                    int h = Math.min(height[deque.peekLast()], height[i]) - height[tmp];
                    int w = i - deque.peekLast() - 1;
                    res += h * w;
                }
            }
            deque.offerLast(i);
        }
        return res;
    }
}

第三题:43. 字符串相乘 - 力扣(LeetCode)

java 复制代码
class Solution {
    public String multiply(String num1, String num2) {
        //直接模拟就好
        int m = num1.length();
        int n = num2.length();
        int[] result = new int[m + n]; // 保存每一位的乘积结果
        // 逐位相乘,注意从个位加至高位
        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); // 乘积
                int sum = mul + result[i + j + 1]; // 加上当前位的值
                result[i + j] += sum / 10; // 进位
                result[i + j + 1] = sum % 10; // 当前位的结果
            }
        }
        // 将结果数组转换为字符串
        StringBuilder sb = new StringBuilder();
        for (int digit : result) {
            if (!(sb.length() == 0 && digit == 0)) { // 忽略结果数组的前导零
                sb.append(digit);
            }
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }
}

第四题:44. 通配符匹配 - 力扣(LeetCode)

本题借用:【宫水三叶】的思路来解决的

java 复制代码
class Solution {
    public boolean isMatch(String ss, String pp) {
        int n = ss.length(), m = pp.length();
        // 技巧:往原字符头部插入空格,这样得到 char 数组是从 1 开始,而且可以使得 f[0][0] = true,可以将 true 这个结果滚动下去
        ss = " " + ss;
        pp = " " + pp;
        char[] s = ss.toCharArray();
        char[] p = pp.toCharArray();
        // f(i,j) 代表考虑 s 中的 1~i 字符和 p 中的 1~j 字符 是否匹配
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (p[j] == '*') {
                    //注意这个地方逻辑的判断:
                    //条件一:不加'*'时的情况:f[i][j - 1]
                    //条件二:(i - 1 >= 0 && f[i - 1][j])
                    //满足其一即可为true
                    f[i][j] = f[i][j - 1] || (i - 1 >= 0 && f[i - 1][j]);
                } else {
                    //当字符为'?'时的判断逻辑,肯定要前面也满足true
                    f[i][j] = i - 1 >= 0 && f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '?');
                }
            }
        }
        return f[n][m];
    }
}

第五题:45. 跳跃游戏 II - 力扣(LeetCode)

java 复制代码
class Solution {
    public int jump(int[] nums) {
        //不dp了,可以直接贪心策略实现,少用点空间
        if(nums.length == 0 || nums.length == 1){
            return 0;
        }
        int cnt = 0, curlen = 0, maxlen = 0;
        for(int i = 0; i < nums.length; i++){
            maxlen = Math.max(maxlen, i + nums[i]);
            if(maxlen >= nums.length - 1){
                cnt++;
                break;
            }
            if(i == curlen){
                curlen = maxlen;
                cnt++;
            }
        }
        return cnt;
    }
}

相关推荐
程序员大雄学编程41 分钟前
「深度学习笔记4」深度学习优化算法完全指南:从梯度下降到Adam的实战详解
笔记·深度学习·算法·机器学习
小O的算法实验室1 小时前
2022年ASOC SCI2区TOP,基于竞争与合作策略的金字塔粒子群算法PPSO,深度解析+性能实测,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
南莺莺1 小时前
邻接矩阵的基本操作
数据结构·算法··邻接矩阵
微波仿真2 小时前
实现多通道ADC多次测量取平均值,使用DMA
算法
余俊晖2 小时前
多模态文档理解视觉token剪枝思路
人工智能·算法·剪枝·多模态
aramae3 小时前
详细分析平衡树--红黑树(万字长文/图文详解)
开发语言·数据结构·c++·笔记·算法
再卷也是菜3 小时前
C++篇(13)计算器实现
c++·算法
CHEN5_023 小时前
【leetcode100】和为k的子数组(两种解法)
java·数据结构·算法
Codeking__3 小时前
DFS算法原理及其模板
算法·深度优先·图论
Victory_orsh4 小时前
“自然搞懂”深度学习系列(基于Pytorch架构)——01初入茅庐
人工智能·pytorch·python·深度学习·算法·机器学习