当前位置: 首页 > news >正文

每日5题Day9 - LeetCode 41 - 45

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

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

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

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)

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)

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)

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

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)

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

相关文章:

  • git 查看远程分支地址
  • WordPress 发布了独立的 SQLite 插件
  • 阿里云oss存储直传回调服务的内网穿透
  • static的了解
  • 软件即服务-SaaS
  • 20.有序性与内存屏障
  • 设计模式14——组合模式
  • vue3的api风格
  • CTF-web-WP-攻防世界-1
  • 11、设计模式之外观模式
  • Html5 + Css3笔记详细汇总大全
  • 什么是流量医美?
  • 若依 ruoyi-vue 用户账号前后端参数校验密码 手机号 邮箱
  • markdown 文件渲染工具推荐 obsidian publish
  • C#自动实现缺陷数据增强
  • 从“图形可视化”到“图生代码”,低代码平台的新挑战
  • Python闭包探索,释放函数记忆的秘术
  • 2024年贵州特岗教师招聘报名流程,速速查收哦!
  • debian nginx upsync consul 实现动态负载
  • openwrt设置开机自启 tailscale为例
  • 阿里开源首个“混合推理模型”:集成“快思考”、“慢思考”能力
  • 王毅出席金砖国家外长会晤
  • 专访丨青年作家杜梨:以动物的视角去观察这个世界
  • 杭州银行一季度净赚超60亿增逾17%,增速较去年同期有所回落
  • 深一度|“凑合过”的利物浦,英超第二冠只求性价比
  • 上海超万套保租房供应高校毕业生,各项目免押、打折等优惠频出