回溯系列--11个题

news2024/10/5 13:05:01

组合问题

第77题. 组合

题⽬链接:https://leetcode-cn.com/problems/combinations/

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

⽰例: 输⼊: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

class Solution {

    List<List<Integer>> result = new ArrayList<>();
    // List<Integer> path = new ArrayList<>(); LinkedList增添的时间复杂度更低
    LinkedList<Integer> path = new LinkedList<>(); 

    public List<List<Integer>> combine(int n, int k) {
        // backtraking(n, k, 0);  返回范围 [1, n] 中所有可能的 k 个数的组合。所以index从1开始
        backtraking(n, k, 1);
        return result;
    }

    void backtraking(int n, int k, int index) {
        if(path.size() == k) {
            // result.add(path); new ArrayList<>() 将LinkedList类型的path转换为ArrayList类型
            result.add(new ArrayList<>(path));
            return;
        }

        for(int i = index; i <= n; i++){
            path.add(i);
            // backtraking(n, k , index + 1);
            backtraking(n, k ,i + 1);
            path.remove(path.size() - 1);
            // path.removeLast();
        }
    }
}

第216题.组合总和III

链接:https://leetcode-cn.com/problems/combination-sum-iii/

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合 中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。

⽰例 1: 输⼊: k = 3, n = 7 输出: [[1,2,4]]

⽰例 2: 输⼊: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
        backtracking(k, n, 0, 1);
        return result;
    }
    
    void backtracking(int k, int n,int sum, int index) {
        if(sum == n && path.size() == k) {
            result.add(new ArrayList<>(path));
            return;
        }

        for(int i = index; i <= 9 && n >= sum + i; i++) {
            path.add(i);
            sum += i;
            backtracking(k, n, sum, i + 1);
            sum -= i;
            path.remove(path.size() - 1);
        }
    }
}

17.电话号码的字母组合

题⽬链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

给定⼀个仅包含数字 2-9 的字符串,返回所有它能表⽰的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

⽰例: 输⼊:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:尽管上⾯的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

class Solution {
     String[] letterMap = new String[]{
            "",//0
            "",//1
            "abc",//2
            "def",//3
            "ghi",//4
            "jkl",//5
            "mno",//6
            "pqrs",//7
            "tuv",//8
            "wxyz"//9
        };
    List<String> result = new ArrayList<>();
    StringBuilder path = new StringBuilder();
    public List<String> letterCombinations(String digits) {
        if(digits == null || digits.length() == 0) return result;
       backTracking(digits, 0);
       return result;
    }

    void backTracking(String digits, int index) {
        if(index == digits.length()) {
            result.add(path.toString());
            return;
        }
        String s = letterMap[digits.charAt(index) - '0'];
        for(int i = 0; i < s.length(); i++){ //对每个按键的水平遍历
            path.append(s.charAt(i));
            backTracking(digits, index + 1); //对不同按键的深度递归
            path.deleteCharAt(path.length() - 1);
        }
    }
}

39. 组合总和

题⽬链接:https://leetcode-cn.com/problems/combination-sum/

给定⼀个⽆重复元素的数组 candidates 和⼀个⽬标数 target ,找出 candidates 中所有可以 使数字和为 target 的组合。 candidates 中的数字可以⽆限制重复被选取。

说明: 所有数字(包括 target)都是正整数。 解集不能包含重复的组合。

⽰例 1: 输⼊:candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]

⽰例 2: 输⼊:candidates = [2,3,5], target = 8, 所求解集为: [ [2,2,2,2], [2,3,3], [3,5] ]

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList path = new LinkedList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        backtracking(candidates, target, 0, 0);
        return result;
    }

    void backtracking(int[] candidates, int target, int sum, int index) {
        if(target == sum) {
            // result.add(path);
            result.add(new ArrayList<>(path));
            return;
        }

        for(int i = index; i < candidates.length && target >= sum + i; i++){ //target >= sum + i要提前排序
            path.add(candidates[i]);
            sum += candidates[i];
            backtracking(candidates, target, sum, i);
            sum -= candidates[i];
            path.remove(path.size() - 1);
        }
    }
}

40.组合总和II

题⽬链接:https://leetcode-cn.com/problems/combination-sum-ii/

给定⼀个数组 candidates 和⼀个⽬标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使⽤⼀次。

说明: 所有数字(包括⽬标数)都是正整数。 解集不能包含重复的组合。

⽰例 1: 输⼊: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]

⽰例 2: 输⼊: candidates = [2,5,2,1,2], target = 5, 所求解集为: [ [1,2,2], [5] ]

class Solution {
    // public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
    LinkedList path = new LinkedList<>();
    boolean[] used;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        used = new boolean[candidates.length];
        Arrays.fill(used, false);
        Arrays.sort(candidates);
        backtracking(candidates, target, 0, 0);
        return result;
    }

    void backtracking(int[] candidates, int target, int sum, int index) {
        if(target == sum) {
            // result.add(path);
            result.add(new ArrayList<>(path));
            return;
        }

        // for(int i = index; i < candidates.length && target >= sum + i; i++){ //target >= sum + i要提前排序
        for(int i = index; i < candidates.length && target >= sum + candidates[i]; i++){
        // if(i > 0 && candidates[i-1] == candidates[i] && used[i - 1] == false){
            if(i > 0 && candidates[i-1] == candidates[i] && used[i - 1] == false){
            continue;
        }
            path.add(candidates[i]);
            sum += candidates[i];
            used[i] = true;
            backtracking(candidates, target, sum, i + 1);
            used[i] = false;
            sum -= candidates[i];
            path.remove(path.size() - 1);
        }
    }
    }

分割问题

131.分割回⽂串

题⽬链接:https://leetcode-cn.com/problems/palindrome-partitioning/

给定⼀个字符串 s,将 s 分割成⼀些⼦串,使每个⼦串都是回⽂串。 返回 s 所有可能的分割⽅案。

⽰例: 输⼊: "aab" 输出: [ ["aa","b"], ["a","a","b"] ]

class Solution {
    List<List<String>> result = new ArrayList<>();
    LinkedList path = new LinkedList<>();
    public List<List<String>> partition(String s) {
        backtracking(s, 0);
        return result;
    }

    void backtracking(String s, int index) {
        if(index == s.length()) {
            // result.add(path);
            result.add(new ArrayList(path));
            return;
        }

        for(int i = index; i < s.length(); i++) {
            if(isvalid(s, index ,i)) {
                //  path.add(s.subStr(i, index));
                // path.add(s.substring(i+1, index));
                path.add(s.substring(index, i+1));
                backtracking(s, i+1);
                path.removeLast();
            }else {
                continue;
            }
             
        }

    }
    
        boolean isvalid(String s, int startIndex, int end) {
        for (int i = startIndex, j = end; i < j; i++, j--) {
            if (s.charAt(i) != s.charAt(j)) {
                return false;
            }
        }
        return true;
    }
}

子集问题

第78题. ⼦集

题⽬地址:https://leetcode-cn.com/problems/subsets/

给定⼀组不含重复元素的整数数组 nums,返回该数组所有可能的⼦集(幂集)。

说明:解集不能包含重复的⼦集。 

⽰例: 输⼊: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList path = new LinkedList<>();
   
    public List<List<Integer>> subsets(int[] nums) {
        
        backStraking(nums, 0);
        return result;
    }

    void backStraking(int[] nums, int index) {
        result.add(new ArrayList<>(path));

        if(index >= nums.length) {
            return;
        }

        for(int i = index; i < nums.length; i++) {
           
            path.add(nums[i]);
            // backStraking(nums, index +1);  怎么能用index呢?!
            backStraking(nums, i +1);
            path.removeLast();
           
        }
    }
}

491.递增⼦序列

题⽬链接:https://leetcode-cn.com/problems/increasing-subsequences/

给定⼀个整型数组, 你的任务是找到所有该数组的递增⼦序列,递增⼦序列的长度⾄少是 2。

⽰例: 输⼊: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

说明: 给定数组的长度不会超过15。

·        数组中的整数范围是 [-100,100]。

        给定数组中可能包含重复数字,相等的数字应该被视为递增的⼀种情况。

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> findSubsequences(int[] nums) {
        backtracking(nums,0);
        return result;
    }

    void backtracking(int[] nums,int index) {
        if(path.size() > 1) { //递增子序列长度至少为2
            result.add(new ArrayList<>(path));
        }

        if(index == nums.length){
            return;
        }

        boolean[] used = new boolean[201]; //同一层相同结点不能重复
        for(int i = index; i < nums.length; i++) {
            //纵向判断递增
            if(path.size() > 0 && nums[i] < path.get(path.size() - 1)) {
                continue;
            }
            //横向判断元素是否重复(序列无序)
            if(used[nums[i] + 100] == true) {
                continue;
            }

            // used[nums[i]] = true; 因为下标没有负数
            used[nums[i] + 100] = true;
            path.add(nums[i]);
            backtracking(nums, i + 1);
            path.removeLast();
           

        }
    }
}

排列问题

46.全排列

题⽬链接:https://leetcode-cn.com/problems/permutations/

给定⼀个 没有重复 数字的序列,返回其所有可能的全排列。

⽰例: 输⼊: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> permute(int[] nums) {
        boolean[] used = new boolean[nums.length + 1]; 
        Arrays.fill(used, false);
        backtracking(nums,used);
        return result;
    }

     //同一树枝标记用过 used[i] == true
     //将used作为参数传递 比较的是同一树枝和同一树层
     //将used放在for循环上面,比较的是for循环是否有重复元素
    void backtracking(int[] nums, boolean[] used) {
        if(path.size() == nums.length) {
            result.add(new ArrayList<>(path));
            return;
        }

        for(int i = 0; i < nums.length; i++) {
            if(used[i] == true) {
                continue;
            }
            used[i] = true;
            path.add(nums[i]);
            backtracking(nums, used);
            path.remove(path.size() - 1);
            used[i] = false;
        }
    }
}
   

47.全排列 II

题⽬链接:https://leetcode-cn.com/problems/permutations-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

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    int len;
    public List<List<Integer>> permuteUnique(int[] nums) {
        len = nums.length;
        boolean[] used = new boolean[nums.length + 1]; //[]是长度  <>是范型  ()是内容
        Arrays.fill(used, false);
        Arrays.sort(nums);
        backTracking(nums,used);
        return result;
    }

    void backTracking(int[] nums, boolean[] used){
        if(path.size() == nums.length) {
            result.add(new ArrayList<>(path));
            return;
        }

        for(int i = 0; i < len; i++) {
            //纵向判断
            if(used[i] == true) continue;
            //横向判断  原序列需要排序
            if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false) continue;

            used[i] = true;
            path.add(nums[i]);
            backTracking(nums, used);
            path.removeLast();
            used[i] = false;
        }
    }
}

棋盘问题

第51题. N皇后

题⽬链接: https://leetcode-cn.com/problems/n-queens/ n

皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

8 皇后问题的⼀种解法:

给定⼀个整数 n,返回所有不同的 n 皇后问题的解决⽅案。 每⼀种解法包含⼀个明确的 n 皇后问题的棋⼦放置⽅案,该⽅案中 'Q' 和 '.' 分别代表了皇后 和空位。

⽰例: 输⼊: 4 输出: [ [".Q..",  "...Q", "Q...", "..Q."],["..Q.",  "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。

class Solution {
    List<List<String>> result = new ArrayList<>();
    
    public List<List<String>> solveNQueens(int n) {
        char[][] chessboard = new char[n][n];
        for(char[] c : chessboard) {
            Arrays.fill(c,'.');
        }
        backtracking(n, 0, chessboard);
        return result;

    }

    void backtracking(int n, int row, char[][] chessboard){
        if(row == n) {
            result.add(Array2List(chessboard));
            return;
        }

        for(int col = 0; col < n; col++) { //行和列都是从0开始
            if(isvalid(n,row,col,chessboard)) {
                chessboard[row][col] = 'Q';
                backtracking(n, row + 1, chessboard);
                chessboard[row][col] = '.';
            }
        }
    }

    public List<String> Array2List(char[][] chessboard) {
        List<String> list = new ArrayList<>();
        
        for (char[] c : chessboard) {
            list.add(String.copyValueOf(c));
        }
        return list;
    }

    public boolean isvalid(int n, int row, int col, char[][] chessboard) {
        // 检查列
        for (int i=0; i<n; ++i) {
            if (chessboard[i][col] == 'Q') {
                return false;
            }
        }

        // 检查45度对角线
        for (int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {
            if (chessboard[i][j] == 'Q') {
                return false;
            }
        }

        // 检查135度对角线
        for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {
            if (chessboard[i][j] == 'Q') {
                return false;
            }
        }
        return true;
    }
}

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

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

相关文章

分享一下蛋糕店在微信小程序上可以实现什么功能

蛋糕店在微信小程序上可以实现的功能 微信小程序作为一种新型的商业模式&#xff0c;正逐渐成为各行各业拓展线上业务的重要手段。对于蛋糕店来说&#xff0c;开发微信小程序可以实现以下功能&#xff1a; 一、展示产品和服务 微信小程序可以作为蛋糕店的产品展示平台&#x…

树状数组总结

【使用总结】 经典用法&#xff1a;单点更新o(logn)&#xff0c;区间查询/区间最大值(1~n&#xff0c;求sum)&#xff0c;o(logn) 扩展用法&#xff1a;区间修改&#xff0c;如对[x,y]区间加上一个数k 模板题&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极…

操作指南 | 如何参与Moonbeam投票委托

投票委托允许没有时间或者专业度一般的用户能够在治理中拥有话语权。该功能加强了决策流程&#xff0c;并且确保更大范围地代表社区利益。 通过Moonbeam委托平台&#xff0c;你需要 $GLMR 和一个相兼容的钱包。此教程使用MetaMask示范。 如何参与投票委托 前往http://delega…

Python数据容器的总结

1、数据容器分类 数据容器&#xff08;一共五个&#xff09;可以从以下视角进行简单的分类&#xff1a; 是否支持下标索引 支持&#xff1a;列表、元组、字符串&#xff08;序列类型&#xff09; 不支持&#xff1a;集合、字典&#xff08;非序列类型&#xff…

基于SSM的校园代购服务订单管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

日本SolarView Compact光伏发电测量系统 目录遍历漏洞复现(CVE-2023-40924)

日本SolarView Compact光伏发电测量系统 目录遍历漏洞复现CVE-2023-40924 一. 系统简介二.漏洞描述三.影响版本四.fofa查询语句五.漏洞复现六.POC&EXP七、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或…

使用java连接Libvirtd

基于springboot web 一、依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId>&l…

网站优化如何更新文章才有效果,有技巧的更新SEO优化文章

很多新手SEO人员都不太清楚网站为什么要每天更新文章&#xff1f;每天更新文章的主要目的是让新站更快地通过审核期&#xff0c;让老网站避免被降权。同时拥有更多的关键词排名&#xff0c;整体提升网站的流量。 提供新鲜和有用的内容&#xff1a;搜索引擎非常重视新鲜和有用的…

长胜证券:美科技股大跌,甲骨文一夜蒸发超3000亿

当地时间9月12日&#xff0c;美股三大股指跌落&#xff0c;其中&#xff0c;道指跌0.05%&#xff0c;标普指数跌0.57%&#xff0c;纳斯达克指数跌1.04%。本周商场重视通胀与顾客开支等经济数据。当天发布的数据显现&#xff0c;美国8月份线上商品价格创40个月最大降幅。美国房租…

四川Certum便宜多域名SSL证书

多域名SSL证书是一种安全协议&#xff0c;通过SSL/TLS协议对多个域名进行加密传输&#xff0c;实现网站的安全访问和数据传输。它不仅可以保护网站的信息安全&#xff0c;还可以提高网站的信任度和排名 。 而Certum是正规的SSL证书颁发机构&#xff0c;旗下SSL证书产品众多&…

docker 镜像内执行命令显示:You requested GPUs: [0] But your machine only has: []

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在docker 镜像环境中&#xff0c;执行“docker exec -it container_name /bin/bash “进入容器之后&#xff0c;执行对应的python命令&#xff0c;显示You requested GPUs: [0] But your machine only…

基于Java+SpringBoot+Vue+uniapp校园点餐小程序(包含协同过滤算法和会员系统,强烈推荐!)

校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 系统功能结构设计4.2 主要功能描述 五…

【【萌新编写risc-v之软件的学习使用】】

萌新编写risc-v软件的学习使用 对于vscode我其实没什么好说的 就是先配置好环境 其实vscde作为一个编译器的软件 其实并不需要指望能往里面加载多少功能 我们需要做的就是赋予编辑器更好用的功能和体验 有些人会在vscode里面甚至加入波形 仿真 我觉得不如交给 vivado来用 在vs…

车载摄像头进入「多元」增长周期,哪些图像传感器厂商领跑竞争力

随着单车搭载摄像头数量的增加&#xff0c;以及对于摄像头性能要求的提高&#xff0c;汽车级图像传感器&#xff08;CIS&#xff09;市场在2022年成为仅次于手机行业的第二大应用领域。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-6月中国市场&#xff08;不含进出口…

Java基础面试整理

Java基础面试 摘要1. 数据类型和变量2. 控制流语句3. 面向对象编程4. 异常处理5. 集合框架6. 多线程7. 输入输出流8. 设计模式9. 字符串操作10. 数组11. 枚举&#xff08;Enum&#xff09;12. 包&#xff08;Package&#xff09;和导入&#xff08;Import&#xff09;13. 接口&…

飞行动力学 - 第22节-动稳定性与运动方程 之 基础点摘要

飞行动力学 - 第22节-动稳定性与运动方程 之 基础点摘要 1. 稳定性定义2. 动稳定性示意图3. 数值仿真结构框图4. 运动响应类型5. 参考资料 1. 稳定性定义 飞机在平衡状态&#xff08;静止或匀速运动&#xff09;受到扰动&#xff1a; 有回到初始状态的趋势&#xff1b;静稳定…

网页录屏方法推荐,满足你的各种录制需求

“网页可以录屏吗&#xff1f;在浏览器观看了一篇教程&#xff0c;但是不能保存&#xff0c;就想用录屏的方法录制下来&#xff0c;可是不知道网页怎么录屏&#xff0c;家人们帮帮忙&#xff0c;非常感谢&#xff01;” 网页录制是将浏览器中的内容录制成视频的过程&#xff0…

算法分析与设计23.9.12晚第一节

23.9.12晚第一节&#xff1a; 解决问题 问题结构 解决问题思路1&#xff1a;(常规思路) Q0: The simplest case. 先找到最简单的情况。 Q1: Decomposed.(INPUT DS, OUTPUT DS) 观察输入输出的数据结构&#xff0c;尝试分解问题。 Q2: Solution neighborhood. 尝试邻域解的变…

机器学习技术(八)——朴素贝叶斯算法实操

机器学习技术&#xff08;八&#xff09;——朴素贝叶斯算法实操 文章目录 机器学习技术&#xff08;八&#xff09;——朴素贝叶斯算法实操一、引言二、导入相关依赖库三、读取并查看数据四、数据预处理五、构建两种模型进行比较1、只考虑Dayofweek以及District2、加入犯罪时间…

MySQL日常使用记录

1.时间 1.1.时间格式化 yyyy-MM-dd HH:mm:ss格式&#xff0c;如下&#xff1a; select date_format(now(), %Y-%m-%d %H:%i:%s) from dual;date_format函数是将date类型按照指定的格式转换成varchar类型 1.2.日期加减 当前天 1 天 select date_format(now(), %Y-%m-%d), …