• 力扣labuladong一刷day5共3题


    力扣labuladong一刷day5共3题

    一、46. 全排列

    题目链接:https://leetcode.cn/problems/permutations/description/
    思路:全排列,无重复数字,排列便会有2,1,3这种情况,所以递归无需指定起始点,排列都是从0开始。只不过纵向需要去重,使用一个标记数组,标记好使用过的数即可。

    class Solution {
        List<List<Integer>> arrayLists = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        public List<List<Integer>> permute(int[] nums) {
            boolean[] used = new boolean[nums.length];
            backTracking(nums, used);
            return arrayLists;
        }
    
        void backTracking(int[] nums, boolean[] used) {
            if (list.size() >= nums.length) {
                arrayLists.add(new ArrayList<>(list));
                return;
            }
    
            for (int i = 0; i < nums.length; i++) {
                if (used[i]) continue;
                list.add(nums[i]);
                used[i] = true;
                backTracking(nums, used);
                list.remove(list.size()-1);
                used[i] = false;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    二、51. N 皇后

    题目链接:https://leetcode.cn/problems/n-queens/
    思路:N皇后,也是典型的回溯法,递归树,for是横向棋盘,递归是纵向棋盘,
    无非就判断是否可用时复杂一点,涉及到一点剪枝,N皇后要求横向纵向45度和135度都不能出现Q
    递归是向下递归的,不符合条件直接回溯了,for迭代,
    所以45度和135度只需要判断当前点的左上角方向和右上角方向

    List<List<String>> arrayLists = new ArrayList<>();
    
        public List<List<String>> solveNQueens(int n) {
            char[][] chars = new char[n][n];
            for (char[] c : chars) {
                Arrays.fill(c, '.');
            }
            backTracking(n,0, chars);
            return arrayLists;
        }
    
        void backTracking(int n, int row, char[][] chars) {
            if (row == n) {
                List<String> list = new ArrayList<>();
                for (char[] aChar : chars) {
                    list.add(String.valueOf(aChar));
                }
                arrayLists.add(list);
                return;
            }
            for (int i = 0; i < n; i++) {
                if (!isAble(chars, n, row, i)) continue;
                chars[row][i] = 'Q';
                backTracking(n, row+1,chars);
                chars[row][i] = '.';
            }
        }
    
        boolean isAble(char[][] chars, int n, int x, int y) {
            for (int i = 0; i < x; i++) {
                if (chars[i][y] == 'Q') return false;
            }
            for (int i=x-1, j=y-1; i>=0 && j>=0; i--, j--) {
                if (chars[i][j] == 'Q') return false;
            }
            for (int i=x-1, j=y+1; i>=0 && j<n; i--,j++) {
                if (chars[i][j] == 'Q') return false;
            }
            return true;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    三、52. N 皇后 II

    题目链接:https://leetcode.cn/problems/n-queens-ii/
    思路:相比上一题更简单也不用记录棋盘结果只需要计数即可。

    class Solution {
        int count = 0;
        public int totalNQueens(int n) {
            char[][] chars = new char[n][n];
            for (char[] c : chars) {
                Arrays.fill(c, '.');
            }
            backTracking(n,0, chars);
            return count;
        }
    
        void backTracking(int n, int row, char[][] chars) {
            if (row == n) {
                count++;
                return;
            }
            for (int i = 0; i < n; i++) {
                if (!isAble(chars, n, row, i)) continue;
                chars[row][i] = 'Q';
                backTracking(n, row+1,chars);
                chars[row][i] = '.';
            }
        }
    
        boolean isAble(char[][] chars, int n, int x, int y) {
            for (int i = 0; i < x; i++) {
                if (chars[i][y] == 'Q') return false;
            }
            for (int i=x-1, j=y-1; i>=0 && j>=0; i--, j--) {
                if (chars[i][j] == 'Q') return false;
            }
            for (int i=x-1, j=y+1; i>=0 && j<n; i--,j++) {
                if (chars[i][j] == 'Q') return false;
            }
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    ROS1云课→02系统架构
    AUTOSAR基础篇之CanTsyn
    Springboot毕设项目基于JavaWeb的健身房管理系统102j4(java+VUE+Mybatis+Maven+Mysql)
    2023-11-17 VsCode使用makefile进行多文件编译
    优思学院|抽样检验的意义是什么?
    ASP.NET Core 性能优化-缓存
    springboot banner
    阿里P8大牛用实例跟你讲明白“Java 微服务架构实战”
    Ubuntu遇到Gemfiie指定版本怎么解决
    P2986 [USACO10MAR] Great Cow Gathering G(换根dp)
  • 原文地址:https://blog.csdn.net/qq_43511039/article/details/134325894