每日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;
    }
}

相关推荐
AlgoNewbie3 分钟前
牛客周赛 Round 88【题解完成】
算法
luckycoding40 分钟前
2747. 统计没有收到请求的服务器数目
算法
TT哇2 小时前
【前缀和】矩阵区域和(medium)
java·线性代数·算法·矩阵
Elendill3 小时前
【算法笔记】并查集详解
笔记·python·算法
BanyeBirth3 小时前
C++高精度算法(加、减、乘)
开发语言·c++·算法
houliabc3 小时前
C语言个人笔记
c语言·数据结构·笔记·算法
Allen Wurlitzer4 小时前
算法刷题记录——LeetCode篇(1.9) [第81~90题](持续更新)
算法·leetcode·职场和发展
@MrLiu4 小时前
# 深度学习中的优化算法详解
人工智能·深度学习·算法·优化器
阳洞洞4 小时前
leetcode 377. Combination Sum IV
算法·leetcode·动态规划·完全背包问题
阿巴~阿巴~5 小时前
蓝桥杯 C/C++ 组历届真题合集速刷(一)
c语言·c++·算法·蓝桥杯