LeetCode刷题13:回溯+剪枝解决216.组合总和 III

news/2024/7/20 20:53:32 标签: leetcode, 剪枝, 算法, java, 深度优先

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7

输出: [[1,2,4]]

解释: 1 + 2 + 4 = 7 没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9

输出: [[1,2,6], [1,3,5], [2,3,4]]

解释: 1 + 2 + 6 = 9 1 + 3 + 5 = 9 2 + 3 + 4 = 9 没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1

输出: []

解释: 不存在有效的组合。 在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

提示:

  • 2 <= k <= 9
  • 1 <= n <= 60

解题思路:

        由题目概述可以知道就是把1-9不重复地排列目标个数并且和与目标值相同,因此我们可以想到用回溯法,即循环+递归:

        for(循环遍历1-9){

                将遍历到的数放入数组

                dfs()递归进行下一次循环

                递归回来后除去该数组元素,防止后续循环使数组长度一直增加的情况,保证该循环内的数组长度保持一致。

        }

        往复该操作直至数组元素个数与目标元素个数相符

        判断是否与目标值相同,相同,则放入存放数组的数组中。

        注:每次操作都需要跳过之前数组已放入的值,避免重复,即剪枝

图示(示例 2):

        

代码实现:

java">class Solution {
    //建立一个局部变量数组来存放数组
    List<List<Integer>> list=new ArrayList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        //创建数组
        List<Integer> l=new ArrayList<>();
        //进入回溯
       dfs(n,l,k,1);
       return list;
    }
    public void dfs(int n,List<Integer> l,int k,int m){
        if(k==0){
            if(n!=0) return;
            list.add(new ArrayList(l));
            return;
        }
        //for循环遍历1-9
        for(int x=m;x<=9;x++){
            //若x>n则说明数组和大于目标值没必要再往后遍历,直接结束
            if(x>n) break;
            l.add(x);
            //进入下一次递归,目标值-x
            dfs(n-x,l,k-1,x+1);
            //去除元素,才能实现后续循环的操作
            l.remove(l.size()-1);
        }
    }
}

 


http://www.niftyadmin.cn/n/5320465.html

相关文章

【OSG案例详细分析与讲解】之五:【3D交互式动画】

文章目录 一、【3D交互式动画】前言 二、【3D交互式动画】实现效果

【Java SE语法篇】6.数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 1.数组的基本概念1.1 为什么使用数组&#xff1f;1.…

Python3.5如何打包编译

python3.5怎么打包编译 问题&#xff1a;用Python开发的小工具有时需要编译打包为Windows(*.exe)、Mac等操作系统下的可执行性文件以供非程序员使用。 解决方案&#xff1a; 一、py2exe 目前只支持到Python3.4&#xff0c;暂不支持Python3.5 二、PyInstaller 安装&#x…

安卓11菜单实现hdmi-4K动态切换

客户要求系统实现动态hdmi-4K与普通分辨率直接热切换&#xff0c;先在菜单中做个试验&#xff0c;设置中加个切换开关&#xff0c;点击开关就可以直接切到hdmi-4K&#xff0c;这个功能实现后可以通过插拔hdmi那个状态&#xff08;sys/class/drm/card0-HDMI-A-1/status&#xff…

【前端转安卓】-Java基础知识笔记

常量定义&#xff1a;final public class HelloWorld {// 静态常量public static final double PI 3.14;// 声明成员常量final int y 10;public static void main(String[] args) {// 声明局部常量final double x 3.3;} }变量声明、赋值 String username,address,phone,te…

蚁群算法(ACO)解决旅行商(TSP)问题的python实现

TSP问题 旅行商问题&#xff08;Travelling Salesman Problem, 简记TSP&#xff0c;亦称货郎担问题)&#xff1a;设有n个城市和距离矩阵D [dij]&#xff0c;其中dij表示城市i到城市j的距离&#xff0c;i, j 1, 2 … n&#xff0c;则问题是要找出遍访每个城市恰好一次的一条回…

TIDB的忘了root用户密码和数据库密码解决办法

方法一&#xff1a; 1、修改配置文件重启tidb&#xff0c;无密码登录修改root密码 找到配置文件 tidb.toml &#xff0c;在[security] 作用域下增加如下配置&#xff1a; [security] skip-grant-tabletrue 重启tidb&#xff1a; sh run_tidb.sh 2、重启后&#xff0c;就可以无密…

Typora上传图片失败PicGo

起初我是在Typora中点击一键上传图片&#xff0c;结果如下&#xff0c;报错。可是我找了半天也没错啊。 最后发现原来是一个图片的命名问题&#xff0c;名字太过于复杂&#xff0c;PicGo识别不出&#xff0c;一个图片报错导致其它也上传不了。 我把它复制到其它文件夹之后&…