Java每日一练(20230506) 全排列II、岛屿数量、有效数独

news2024/12/22 16:17:09

目录

1. 全排列 II  🌟🌟

2. 岛屿数量  🌟🌟

3. 有效的数独  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:[[1,1,2], [1,2,1], [2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

出处:

https://edu.csdn.net/practice/27137143

代码1:

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        dfs(nums, 0);
        return ans;
    }
    private void dfs(int[] nums, int cur) {
        if (cur == nums.length) {
            List<Integer> line = new ArrayList<>();
            for (int i : nums) {
                line.add(i);
            }
            ans.add(line);
        } else {
            for (int i = cur; i < nums.length; i++) {
                if (canSwap(nums, cur, i)) {
                    swap(nums, cur, i);
                    dfs(nums, cur + 1);
                    swap(nums, cur, i);
                }
            }
        }
    }
    private boolean canSwap(int nums[], int begin, int end) {
        for (int i = begin; i < end; i++) {
            if (nums[i] == nums[end]) {
                return false;
            }
        }
        return true;
    }
    private void swap(int nums[], int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

代码2:

import java.util.*;
class permuteUnique {
    public static class Solution {
        public List<List<Integer>> permuteUnique(int[] nums) {
            List<List<Integer>> res = new ArrayList<>();
            Arrays.sort(nums);
            while (true) {
                res.add(getList(nums));
                if (!nextPermutation(nums)) {
                    break;
                }
            }
            return res;
        }
        private List<Integer> getList(int[] nums) {
            List<Integer> list = new ArrayList<>();
            for (int num : nums) {
                list.add(num);
            }
            return list;
        }
        private boolean nextPermutation(int[] nums) {
            int i = nums.length - 2;
            while (i >= 0 && nums[i] >= nums[i + 1]) {
                i--;
            }
            if (i < 0) {
                return false;
            }
            int j = nums.length - 1;
            while (j > i && nums[j] <= nums[i]) {
                j--;
            }
            swap(nums, i, j);
            reverse(nums, i + 1);
            return true;
        }
        private void swap(int[] nums, int i, int j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
        private void reverse(int[] nums, int start) {
            int i = start, j = nums.length - 1;
            while (i < j) {
                swap(nums, i, j);
                i++;
                j--;
            }
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = {1,1,2};
        System.out.println(s.permuteUnique(nums));
        int[] nums2 = {1,2,3};
        System.out.println(s.permuteUnique(nums2));
   }
}

输出:

[[1, 1, 2], [1, 2, 1], [2, 1, 1]]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]


2. 岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

出处:

https://edu.csdn.net/practice/27137144

代码1: dfs

import java.util.*;
class numIslands {
    public static class Solution {
        public int numIslands(char[][] grid) {
            int islandNum = 0;
            for (int i = 0; i < grid.length; i++) {
                for (int j = 0; j < grid[0].length; j++) {
                    if (grid[i][j] == '1') {
                        infect(grid, i, j);
                        islandNum++;
                    }
                }
            }
            return islandNum;
        }
        public void infect(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] = '2';
            infect(grid, i + 1, j);
            infect(grid, i - 1, j);
            infect(grid, i, j + 1);
            infect(grid, i, j - 1);
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        char[][] grid = {
            {'1','1','1','1','0'},
            {'1','1','0','1','0'},
            {'1','1','0','0','0'},
            {'0','0','0','0','0'}};
        System.out.println(s.numIslands(grid));
        char[][] grid2 = {
            {'1','1','0','0','0'},
            {'1','1','0','0','0'},
            {'0','0','1','0','0'},
            {'0','0','0','1','1'}};
        System.out.println(s.numIslands(grid2));
   }
}

代码2: bfs

import java.util.*;
class numIslands {
    public static class Solution {
        public int numIslands(char[][] grid) {
            if (grid == null || grid.length == 0) {
                return 0;
            }
            int m = grid.length;
            int n = grid[0].length;
            int islandNum = 0;
            int[] dx = {0, 0, -1, 1};
            int[] dy = {-1, 1, 0, 0};
            Queue<int[]> queue = new LinkedList<>();
            boolean[][] visited = new boolean[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (grid[i][j] == '1' && !visited[i][j]) {
                        islandNum++;
                        visited[i][j] = true;
                        queue.offer(new int[]{i, j});
                        while (!queue.isEmpty()) {
                            int[] curr = queue.poll();
                            for (int k = 0; k < 4; k++) {
                                int x = curr[0] + dx[k];
                                int y = curr[1] + dy[k];
                                if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !visited[x][y]) {
                                    visited[x][y] = true;
                                    queue.offer(new int[]{x, y});
                                }
                            }
                        }
                    }
                }
            }
            return islandNum;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        char[][] grid = {
            {'1','1','1','1','0'},
            {'1','1','0','1','0'},
            {'1','1','0','0','0'},
            {'0','0','0','0','0'}};
        System.out.println(s.numIslands(grid));
        char[][] grid2 = {
            {'1','1','0','0','0'},
            {'1','1','0','0','0'},
            {'0','0','1','0','0'},
            {'0','0','0','1','1'}};
        System.out.println(s.numIslands(grid2));
   }
}

输出:

1
3


3. 有效的数独

请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

注意:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。

示例 1:

输入:board = 
[["5","3",".",".","7",".",".",".","."],
 ["6",".",".","1","9","5",".",".","."],
 [".","9","8",".",".",".",".","6","."],
 ["8",".",".",".","6",".",".",".","3"],
 ["4",".",".","8",".","3",".",".","1"],
 ["7",".",".",".","2",".",".",".","6"],
 [".","6",".",".",".",".","2","8","."],
 [".",".",".","4","1","9",".",".","5"],
 [".",".",".",".","8",".",".","7","9"]]
输出:true

示例 2:

输入:board = 
[["8","3",".",".","7",".",".",".","."],
 ["6",".",".","1","9","5",".",".","."],
 [".","9","8",".",".",".",".","6","."],
 ["8",".",".",".","6",".",".",".","3"],
 ["4",".",".","8",".","3",".",".","1"],
 ["7",".",".",".","2",".",".",".","6"],
 [".","6",".",".",".",".","2","8","."],
 [".",".",".","4","1","9",".",".","5"],
 [".",".",".",".","8",".",".","7","9"]]
输出:false
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字或者 '.'

出处:

https://edu.csdn.net/practice/27137145

代码1:

import java.util.*;
class isValidSudoku {
    public static class Solution {
        public boolean isValidSudoku(char[][] board) {
            boolean[][] row = new boolean[9][9];
            boolean[][] col = new boolean[9][9];
            boolean[][] block = new boolean[9][9];
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    if (board[i][j] != '.') {
                        int num = board[i][j] - '1';
                        int blockIndex = i / 3 * 3 + j / 3;
                        if (row[i][num] || col[j][num] || block[blockIndex][num]) {
                            return false;
                        } else {
                            row[i][num] = true;
                            col[j][num] = true;
                            block[blockIndex][num] = true;
                        }
                    }
                }
            }
            return true;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        char[][] board = {
            {'5','3','.','.','7','.','.','.','.'},
            {'6','.','.','1','9','5','.','.','.'},
            {'.','9','8','.','.','.','.','6','.'},
            {'8','.','.','.','6','.','.','.','3'},
            {'4','.','.','8','.','3','.','.','1'},
            {'7','.','.','.','2','.','.','.','6'},
            {'.','6','.','.','.','.','2','8','.'},
            {'.','.','.','4','1','9','.','.','5'},
            {'.','.','.','.','8','.','.','7','9'}};
        System.out.println(s.isValidSudoku(board));
        char[][] board2 = {
            {'8','3','.','.','7','.','.','.','.'},
            {'6','.','.','1','9','5','.','.','.'},
            {'.','9','8','.','.','.','.','6','.'},
            {'8','.','.','.','6','.','.','.','3'},
            {'4','.','.','8','.','3','.','.','1'},
            {'7','.','.','.','2','.','.','.','6'},
            {'.','6','.','.','.','.','2','8','.'},
            {'.','.','.','4','1','9','.','.','5'},
            {'.','.','.','.','8','.','.','7','9'}};
        System.out.println(s.isValidSudoku(board2));
   }
}

代码2: 

import java.util.*;
class isValidSudoku {
    public static class Solution {
        public boolean isValidSudoku(char[][] board) {
            Map<Integer, Set<Character>> rows = new HashMap<>();
            Map<Integer, Set<Character>> cols = new HashMap<>();
            Map<Integer, Set<Character>> boxes = new HashMap<>();
            for (int i = 0; i < 9; i++) {
                rows.put(i, new HashSet<>());
                cols.put(i, new HashSet<>());
                boxes.put(i, new HashSet<>());
            }
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    char num = board[i][j];
                    if (num == '.') {
                        continue;
                    }
                    if (rows.get(i).contains(num) || cols.get(j).contains(num) || boxes.get((i / 3) * 3 + j / 3).contains(num)) {
                        return false;
                    }
                    rows.get(i).add(num);
                    cols.get(j).add(num);
                    boxes.get((i / 3) * 3 + j / 3).add(num);
                }
            }
            return true;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        char[][] board = {
            {'5','3','.','.','7','.','.','.','.'},
            {'6','.','.','1','9','5','.','.','.'},
            {'.','9','8','.','.','.','.','6','.'},
            {'8','.','.','.','6','.','.','.','3'},
            {'4','.','.','8','.','3','.','.','1'},
            {'7','.','.','.','2','.','.','.','6'},
            {'.','6','.','.','.','.','2','8','.'},
            {'.','.','.','4','1','9','.','.','5'},
            {'.','.','.','.','8','.','.','7','9'}};
        System.out.println(s.isValidSudoku(board));
        char[][] board2 = {
            {'8','3','.','.','7','.','.','.','.'},
            {'6','.','.','1','9','5','.','.','.'},
            {'.','9','8','.','.','.','.','6','.'},
            {'8','.','.','.','6','.','.','.','3'},
            {'4','.','.','8','.','3','.','.','1'},
            {'7','.','.','.','2','.','.','.','6'},
            {'.','6','.','.','.','.','2','8','.'},
            {'.','.','.','4','1','9','.','.','5'},
            {'.','.','.','.','8','.','.','7','9'}};
        System.out.println(s.isValidSudoku(board2));
   }
}

输出:

true
false


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

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

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

相关文章

atbf中imu数据读取逻辑分析仪抓取

一、说明 使用逻辑分析仪抓区imu的spi和中断io的信号&#xff0c;从而侧面描述atbf在imu上的数据读取方式&#xff1b; 二、硬件说明 1、硬件材料 1、mcu at32F437开发板 2、imu icm42688p 3、逻辑分析仪 梦源逻辑分析仪 4、调试器 jlink 2、原理图 3、实物图 4、固…

【git】git lfs

目录 原理 使用方法 报错记录 certificate signed by unknown authority 原理 项目中的大文件会很占空间。 git lfs(large file storage)将大文件替换为小指针, 当真正需要到这些大文件的时候, 才会从本地或者远端的lfs缓存中下载这些大文件. git lfs拥有本地lfs缓存和远端…

ubuntu系统版本查询命令方法

目录 一、使用命令&#xff1a;cat /proc/version 查看 二、 使用命令&#xff1a;uname -a 查看 三、 使用命令&#xff1a;lsb_release -a 查看 四、使用命令&#xff1a;hostnamectl 查看 五、使用命令&#xff1a;cat /etc/issue 查看 一、使用命令&#xff1a;cat /…

LeetCode:21. 合并两个有序链表

21. 合并两个有序链表 1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果 1&#xff09;题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2…

百度地图API介绍

4. 百度地图api 介绍 1. api开发文档 1.2 区别 JavaScript API v3.0 JavaScript API v3.0 链接 ,百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富、交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HT…

2023.03 青少年机器人技术等级考试理论综合试卷(三级)

2023 年 3 月青少年机器人技术等级考试理论综合试卷&#xff08;三级&#xff09; 一、单选题(共 20 题&#xff0c;共 80 分) 1. Arduino UNO/Nano 主控板&#xff0c;电位器连接到 A0 引脚&#xff0c;下图程序运行时&#xff0c;变量 potVal 值的范围是&#xff1f;&#xf…

【原创】DELL R750xs 无盘ESXi7安装

一、环境 一台磁盘阵列 多台DELL R750xs 充当esxi主机。 当前端口组 当前虚拟交换机 当前物理网卡 当前VMKernel网卡 当前ISCSI配置 二、问题 虚拟化环境重启时&#xff0c;ESXi主机比磁盘阵列先启动&#xff0c;启动后发现磁盘阵列处于脱机状态。 三、目标 让磁盘阵列启动…

SuperMap GIS基础产品云GIS FAQ集锦(2)

SuperMap GIS基础产品云GIS FAQ集锦&#xff08;2&#xff09; 【iManager】云套件ispeco-dashboard-api的日志等级只有到info&#xff0c;如何设置才能查看到debug级别的日志&#xff1f; 【解决方案】可以在ispeco-dashboard-api的deployment中添加以下环境变量&#xff0c;…

C++——类和对象(3)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月6日 内容&#xff1a;C类和对象内容讲解 目录 前言&#xff1a; 1.运算符重载&#xff08;续&#xff09;&#xff1a; 2.赋值重载&#xff1a; 结尾&#xff1a; 前言&#xff1a; 在上一篇博客中我们再一次讲解了…

【Python入门】Python的判断语句(布尔类型和比较运算符)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

JavaScript:二叉树(层序遍历)

二叉树的层序遍历 层序遍历&#xff1a;逐层地&#xff0c;从左到右访问所有节点 广度优先 文章目录 二叉树的层序遍历102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09;107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09;199. 二叉树的右视图 - 力…

Center-based 3D Object Detection and Tracking 论文学习

论文地址&#xff1a;Center-based 3D Object Detection and Tracking Github 地址&#xff1a;Center-based 3D Object Detection and Tracking 1. 解决了什么问题&#xff1f; 在点云中&#xff0c;3D 目标通常以 3D 框的形式表示。这个表征借鉴于 2D 图像的检测&#xff0…

nvm管理node版本与node对应的npm的版本

五一长假回来打开电脑发现自己的vscode不能成功运行项目&#xff0c;npm run dev之后没有任何反应&#xff0c;于是我想着使用cmd打开试试&#xff0c;结果cmd打开后画面只有一个横着的光标再闪&#xff0c;停几秒后就自动关闭了&#xff0c;看其他的博主写的解决方法一一试过了…

错排问题之年会抽奖与抄送列表

目录 一、编程题 1.年会抽奖 2.抄送列表 二、选择题 1.操作系统中关于竞争和死锁的关系下面描述正确的是&#xff1f; 2.并发是并行的不同表述&#xff0c;其原理相同。 3.在Unix系统中&#xff0c;处于()状态的进程最容易被执行。 4.当系统发生抖动&#xff08;thrashi…

git版本升级后的问题

升级后的版本 git version 2.40.1.windows.1问题 RSA公钥和私钥是否有问题&#xff08;本地和gitlab&#xff09;[Git for Windows]的升级日志 Git for Windows 2.36.1 Git for Windows 2.33.0(2) 查看OpenSSH版本信息 OpenSSH v8.7p1 OpenSSH v8.8p1 解决方案 在本机~/.ss…

轨交展:人大金仓护航“中国式现代化的开路先锋”

2023北京-青岛国际城市轨道交通展览会 以“智赋城轨、绿色发展”为主题&#xff0c;2023北京-青岛国际城市轨道交通展览会暨高峰论坛于4月27日-29日在青岛举办&#xff0c;人大金仓携自主创新技术成果以及系列行业解决方案亮相&#xff0c;受到用户、伙伴的广泛关注和高度认可。…

GaussDB数据库基础函数介绍-下

接上一篇&#xff0c;本节继续介绍GaussDB数据库常用基础函数 目录 5、范围函数 6、窗口函数 7、聚集函数 8、安全函数 9、系统信息函数 10、动态脱敏函数 GaussDB常用基础函数介绍与示例 5、范围函数 在GaussDB数据库中&#xff0c;范围函数是指用于处理数据库范围的函…

Linux — 线程池及多线程结尾

目录 一、线程池 线程池的应用场景&#xff1a; 线程池示例&#xff1a; 二、线程安全的单例模式 什么是单例模式 什么是设计模式 单例模式的特点 饿汉实现方式和懒汉实现方式 三、STL,智能指针和线程安全 四、其他常见的各种锁 五、读者写者问题(了解) 读写锁 读写…

搭建Stable Diffusion WebUI详细过程

文章目录 1、环境搭建1.1、GPU服务器选择1.2、配置服务器环境 2、源码和模型下载3、安装依赖库文件4、运行项目5、视频教程 1、环境搭建 为了方便&#xff0c;这里直接选择Vultr提供的已安装Anaconda的Ubuntu 22.04系统。 如果你自己电脑有足够的显存&#xff0c;你也可以在自…

Nacos Config 配置帐号密码加密后,注入过程中如何解密?

背景 线上项目规定不能在配置文件中出现帐号、密码的明文信息&#xff0c;所以必须加密。 引入 Nacos Config 配置后&#xff0c;Nacos Config 帐号密码、加密&#xff0c;服务注册发现也用相同的 nacos 帐号密码&#xff0c;那么如何解密才能保证 Nacos Config 服务能够正确…