每日5题Day8 - LeetCode 36 - 40

news2025/3/10 8:30:01

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

第一题:36. 有效的数独 - 力扣(LeetCode)

题目要求我们进行判断,我们不需要自己填写,所以要一个标志位,来看当前的值是否在行、列、格中出现过,每当这时候可以考虑使用位掩码。

class Solution {
    public boolean isValidSudoku(char[][] board) {
        int[] line = new int[9];// 行
        int[] col = new int[9];// 列
        int[] cell = new int[9];// 9宫格
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                // 如果当前位置没有数字,不用判断。
                if (board[i][j] == '.')
                    continue;
                //使用位掩码来记录数字
                int shift = 1 << (board[i][j] - '0');// 确定第几位
                int k = (i / 3) * 3 + j / 3;// 9宫格的第几个。
                // 如果对应的位置只要有一个被标记过,说明有冲突,直接返回false。
                //&与要求两边完全相同才大于0,下面这一步在判断是否有相同数字出现过
                if ((col[i] & shift) > 0 || (line[j] & shift) > 0
                        || (cell[k] & shift) > 0)
                    return false;
                // 把当前位置所在的行,列以及9宫格都标记为该数字已经存在。
                //或|只要某一位是1,则都是1,所以不管原来的col[i]等是否为0,
                //反正判断的时候还是判断col[i] & shift,所以下面这样写正确
                //建议自己手动模拟一下
                col[i] |= shift;
                line[j] |= shift;
                cell[k] |= shift;
            }
        }
        return true;
    }
}

第二题:37. 解数独 - 力扣(LeetCode)

class Solution {
    //类似于dfs,要找到刚好唯一一组解,可能会涉及到已经放入的值回退的情况
    //直接使用空间换时间了,不回退直接判断可不可以放,注意看两层循环那个
    //if-for-return的逻辑:如果是'.' 那么能不能放数字,如果放了就继续,否则return false
    //再注意看for循环里的逻辑,判断这个数字放进去满足数独不,所以有一个isValidSudoku的判断函数
    public void solveSudoku(char[][] board) {
        solveSudokuHelper(board);
    }
    private boolean solveSudokuHelper(char[][] board){
        for (int i = 0; i < 9; i++){ // 遍历行
            for (int j = 0; j < 9; j++){ // 遍历列
                if (board[i][j] != '.'){ // 跳过原始数字
                    continue;
                }
                for (char k = '1'; k <= '9'; k++){ // (i, j) 这个位置放k是否合适
                    if (isValidSudoku(i, j, k, board)){
                        board[i][j] = k;
                        if (solveSudokuHelper(board)){ // 如果找到合适一组立刻返回
                        //注意这个地方的判断,潜逃了两层true的判断
                            return true;
                        }
                        board[i][j] = '.';
                    }
                }
                return false;
            }
        }
        return true;
    }
    private boolean isValidSudoku(int row, int col, char val, char[][] board){
        //分别判断行列格里是否存在相同元素
        for (int i = 0; i < 9; i++){
            if (board[row][i] == val){
                return false;
            }
        }
        for (int j = 0; j < 9; j++){
            if (board[j][col] == val){
                return false;
            }
        }
        int startRow = (row / 3) * 3;
        int startCol = (col / 3) * 3;
        for (int i = startRow; i < startRow + 3; i++){
            for (int j = startCol; j < startCol + 3; j++){
                if (board[i][j] == val){
                    return false;
                }
            }
        }
        return true;
    }
}

第三题:38. 外观数列 - 力扣(LeetCode)

public class Solution {
    // countAndSay 方法用于生成一个特定的字符串序列。
    // 序列的第 n 项是通过将第 n-1 项字符串中的连续相同字符进行计数和描述来生成的。
    public static String countAndSay(int n) {
        // 递归出口:如果 n 为 1,则返回字符串 "1",这是序列的第一项。
        if (n == 1) {
            return "1";
        }
        // 递归调用:如果 n 大于 1,则先递归调用 countAndSay(n - 1) 生成第 n-1 项,
        // 然后调用 transfer 方法将第 n-1 项转换为第 n 项。
        return transfer(countAndSay(n - 1));
    }

    // transfer 方法接受一个字符串 s 作为输入,并生成下一个字符串。
    // 它通过计数 s 中连续出现的相同字符,并将计数和字符拼接起来形成新的字符串。
    public static String transfer(String s) {
        StringBuilder sb = new StringBuilder(); // 使用 StringBuilder 来构建最终的字符串。
        int count = 1; // 初始化计数器,用于计数连续相同字符的数量。
        int length = s.length(); // 获取输入字符串的长度。
        int i;
        char temp = s.charAt(0); // 初始化临时变量 temp 为字符串的第一个字符。

        // 遍历输入字符串 s。
        for (i = 1; i <= length; i++) {
            // 如果当前字符 temp 与 s.charAt(i) 相同,继续计数。
            while (i < length && temp == s.charAt(i)) {
                count++; // 连续字符计数加 1。
                i++; // 移动到下一个字符。
            }
            // 如果 i < length,说明找到了不同的字符,更新 temp。
            if (i < length) {
                temp = s.charAt(i);
            }
            // 将当前字符的计数和字符本身添加到 StringBuilder 中。
            sb.append(count); // 添加计数。
            sb.append(s.charAt(i - 1)); // 添加字符本身。
            // 重置计数器,为下一个字符的计数做准备。
            count = 1; 
        }
        // 返回构建好的字符串。
        return sb.toString();
    }
}

第四题:39. 组合总和 - 力扣(LeetCode)

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        //为了避免排列的重复情况出现,所以我们先进行排序
        Arrays.sort(candidates);
        traversal(0, target, candidates);
        return res;
    }

    private void traversal(int start, int target, int[] candidates){
        //把满足条件的提出来
        if(target == 0){
            res.add(new ArrayList<>(path));
            return;
        }
        for(int i = start; i < candidates.length; i++){
            //对于每一个candidate进行遍历,因为我们升序排列了,所以一旦选过了,
            //就不会再回去,就避免了排列情况的发生,实际上变为了组合
            if(target - candidates[i] >= 0){
                path.add(candidates[i]);
                traversal(i, target - candidates[i], candidates);
                //记得回溯
                path.remove(path.size() - 1);
            }else{
                //注意给一个边界条件,如果不满足了就退出
                break;
            }
        }
    }
}

 第五题:40. 组合总和 II - 力扣(LeetCode)


class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates); // 对数组进行排序
        List<List<Integer>> res = new ArrayList<>();
        //因为每个候选人数字只能出现一次,所以我们与上一题不同的地方是要多加入一个标记数组
        backtrack(candidates, target, 0, new ArrayList<>(), res, new boolean[candidates.length]);
        return res;
    }
 
    private void backtrack(int[] candidates, int target, int start, List<Integer> path, List<List<Integer>> res, boolean[] used) {
        if (target == 0) {
            res.add(new ArrayList<>(path)); // 找到一种组合
            return;
        }
        for (int i = start; i < candidates.length; i++) {
            // 本质来说,这题有重复元素的排列导致的结果重复的问题,必须去重
            // 跳过重复的元素,注意这种去重的方式(避免上一行提到的情况)
            if (i > start && candidates[i] == candidates[i - 1]) {
                continue;
            }
            // 如果当前元素大于剩余目标,直接返回
            //注意边界条件
            if (candidates[i] > target) {
                break;
            }
            // 使用当前元素
            if (!used[i]) {
                used[i] = true; // 标记为已使用
                path.add(candidates[i]); // 添加到路径
                backtrack(candidates, target - candidates[i], i + 1, path, res, used); // 递归调用
                path.remove(path.size() - 1); // 回溯,移除当前元素
                used[i] = false; // 重置为未使用
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1693221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 存储过程(实验报告)

一、实验名称&#xff1a; 存储过程 二、实验日期&#xff1a; 2024 年5 月 25 日 三、实验目的&#xff1a; 掌握MySQL存储过程的创建及调用&#xff1b; 四、实验用的仪器和材料&#xff1a; 硬件&#xff1a;PC电脑一台&#xff1b; 配置&#xff1a;内存&#xff0…

外卖霸王餐返利外卖会员卡小程序开发

外卖霸王餐返利外卖会员卡小程序开发 "社交电商赋能下的外卖返利小程序"是专为商家与用户双赢而设计的创新平台。 以下是其开发方案的详细步骤&#xff1a; 一、需求梳理&#xff1a;首先&#xff0c;我们需要明确小程序的核心功能和特色。包括设定活动类型、返利…

7款好用到离谱的神级App推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 转眼间&#xff0c;2024年已经是下个月。最近有很多小伙伴的咨询&#xff0c;我也赶紧整理了7款好用的软件&#xff0c;希望对大家有所帮助。 …

Spring MVC/Web

1.Spring MVC 的介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;也是Spring框架的一部分。它提供了灵活可扩展的MVC架构&#xff0c;方便开发者构建高性能的Web应用程序&#xff0c;并与 Spring 生态系统无缝集成。 2.MVC 设计模式 MVC&#xff08;Model…

【静态分析】在springboot使用太阿(Tai-e)01

参考&#xff1a;使用太阿&#xff08;Tai-e&#xff09;进行静态代码安全分析&#xff08;spring-boot篇一&#xff09; - 先知社区 ---------------------------------------------------------------------- 由于spring-boot实现了控制反转与面向切面编程的设计思想&#x…

Ubuntu 如何根据NVIDIA显卡型号确定对应的显卡驱动版本并安装

目录 一、查询推荐安装的驱动版本 二、安装推荐版本的驱动 1. 通过终端安装&#xff0c;只安装 nvidia 驱动&#xff08;亲测可用&#xff01;&#xff09; 2. 通过 software & Updates 安装&#xff0c;安装 nvidia 驱动。 三、查询能安装的最新的显卡驱动版本 1. 方…

微信好友这样打标签更高效!

为什么要做标签管理? ① 通过标签管理&#xff0c;可以清晰的知道每个私域好友的关系程度&#xff0c;如哪些是忠诚客户&#xff0c;哪些是意向客户&#xff0c;哪些是刚加上的客户等等。 这样就知道下一步要怎么操作&#xff0c;做到精细化运营。如忠诚客户跟进维护&#x…

逍遥模拟器安装xp时报错处理

在执行script.sh&#xff0c;无法执行程序&#xff0c;报错如下&#xff1a; Mounting /system and /vendor read-write /dev/block/sda6 is read-only 尝试了很多种的方法&#xff0c;都不行 经过研究发现是逍遥模拟器的设置问题&#xff1a; 出问题时&#xff0c;磁盘共享…

VBA批量合并带有图片、表格与文本框的Word

本文介绍基于VBA语言&#xff0c;对大量含有图片、文本框与表格的Word文档加以批量自动合并&#xff0c;并在每一次合并时添加分页符的方法。 在我们之前的文章基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符&#xff08;https://blog.csdn.net/zhebu…

[读论文]精读Self-Attentive Sequential Recommendation

论文链接&#xff1a;https://arxiv.org/abs/1808.09781 其他解读文章&#xff1a;https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征&#xff0c;这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…

【热门话题】CentOS 常见命令指南

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 CentOS 常见命令指南一、文件与目录操作1. 切换目录2. 查看当前目录3. 列出目录…

vue+iview tabs context-menu 弹出框怎么修改样式

今天遇到一个需求说页面顶部的菜单右键弹出框离得有点远 代码是这样 <Tabs type"card" closable class"main-tags-col-tabs" v-model"activeTab" on-click"handleClickTag" :before-remove"handleBeforeRemove" capt…

ArcGIS提取含有计曲线的等高线

喜欢就关注我们吧&#xff01; 今天我么来看看&#xff0c;如何利用DEM提取含有计曲线的等高线&#xff01; 常规的话我们利用DEM提取的等高线都是不带计曲线的&#xff0c;无法把计曲线标注出来&#xff0c;今天我们就来看下&#xff0c;如何处理一下哦&#xff01;提取带有计…

【狂神说Java】Redis笔记以及拓展

一、Redis 入门 Redis为什么单线程还这么快&#xff1f; 误区1&#xff1a;高性能的服务器一定是多线程的&#xff1f; 误区2&#xff1a;多线程&#xff08;CPU上下文会切换&#xff01;&#xff09;一定比单线程效率高&#xff01; 核心&#xff1a;Redis是将所有的数据放在内…

开视频号小店要花哪些钱?这些费用大家要知道

大家好&#xff0c;我是喷火龙。 目前&#xff0c;视频号小店从推出到现在已经快两年的时间了&#xff0c;视频号小店虽然门槛高&#xff0c;但是单价也高&#xff0c;利润也高&#xff0c;市场环境也好&#xff0c;算是一个不错的项目。 接下来给大家讲讲开视频号小店要花哪…

ensp-三层交换技术

交换机-三层交换 一.概述 单臂路由有明显的缺陷,单臂路由的链路使用率高,可能会造成网路拥塞,造成网络不可用 可以让多个交换机连接路由器的不同接口,但是路由器的接口毕竟有限,不像交换机一样有那么多接口 使用三层交换解决路由器接口不够用问题 二.三层交换 1.创建多个VLAN…

可重构柔性装配产线,为智能制造领域带来了新的革命性变革

随着科技的飞速发展&#xff0c;个性化需求逐渐成为市场的主导。在这个充满变革的时代&#xff0c;制造业正面临着前所未有的挑战和机遇。如何快速响应市场需求、提高生产效率、保证产品质量&#xff0c;成为每一家制造企业必须思考的问题。 在这样的背景下&#xff0c;富唯智…

【MATLAB源码-第214期】基于matlab的遗传算法GA最短路径路由优化算法仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在现代网络通信和路径规划领域&#xff0c;最短路径路由优化算法是一项关键技术。它涉及在给定的网络拓扑中寻找从源点到目标点的最短或成本最低的路径。近年来&#xff0c;遗传算法&#xff08;GA&#xff09;因其出色的全局…

Python3 笔记:部分专有名词解释

1、python 英 /ˈpaɪθən/ 这个词在英文中的意思是蟒蛇。但据说Python的创始人Guido van Rossum&#xff08;吉多范罗苏姆&#xff09;选择Python这个名字的原因与蟒蛇毫无关系&#xff0c;只是因为他是“蒙提派森飞行马戏团&#xff08;Monty Python&#xff07;s Flying Ci…

2024.05.18学习记录

1、Vue3 Composition API Vite jsx 2、react 基本使用、高级用法 3、刷题&#xff1a;回溯部分剩下的题目