组合(力扣)dfs + 回溯 + 剪枝 JAVA

这篇具有很好参考价值的文章主要介绍了组合(力扣)dfs + 回溯 + 剪枝 JAVA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

1 <= n <= 20
1 <= k <= n

解题思路:

1.每个元素有选与不选两种情况,

2.回溯能将选与不选这两种情况都包含

3.递归刚好能满足这个需求

组合(力扣)dfs + 回溯 + 剪枝 JAVA,leetcode,深度优先,剪枝

dfs + 回溯代码:

class Solution {
    public List<List<Integer>> combine(int n, int k) {
           List<List<Integer>> end = new ArrayList<>();
           List<Integer> mb = new ArrayList<>();
           
        	   addmbzh(1, k, end, mb, n);
           
           return end;
    }
    public static void addmbzh(int x, int k, List<List<Integer>> end, List<Integer> none, int n) { 
        if(x > n + 1) return;
    	if(none.size() == k) {
        end.add(new ArrayList<Integer>(none));
        return;
        }
        none.add(x);
        addmbzh(x + 1, k, end, none, n);
    	none.remove(none.size() - 1);
    	addmbzh(x + 1, k, end, none, n);
    }
}

组合(力扣)dfs + 回溯 + 剪枝 JAVA,leetcode,深度优先,剪枝

可以出上述递归树,有很多没有用的分支,可以加入特定判断条件将无用分支剪切掉

if(none.size() + n - x + 1 < k) return;//即剩下元素不足,直接退出

dfs + 回溯 + 剪枝:

class Solution {
    public List<List<Integer>> combine(int n, int k) {
           List<List<Integer>> end = new ArrayList<>();
           List<Integer> mb = new ArrayList<>();
           
        	   addmbzh(1, k, end, mb, n);
           
           return end;
    }
    public static void addmbzh(int x, int k, List<List<Integer>> end, List<Integer> none, int n) { 
        if(none.size() + n - x + 1 < k) return;//退出条件
    	if(none.size() == k) {
          end.add(new ArrayList<Integer>(none));
          return;
        }
        none.add(x);//选
        addmbzh(x + 1, k, end, none, n);
    	none.remove(none.size() - 1);//回溯(不选)
    	addmbzh(x + 1, k, end, none, n);
    }
}

组合(力扣)dfs + 回溯 + 剪枝 JAVA,leetcode,深度优先,剪枝
不难看出爆搜会超时的主要原因是一些无用枝节耗费了大量时间

本代码也可以用全局变量来写,反而更简洁

代码:

class Solution {
    List<List<Integer>> nums = new ArrayList<>();
    List<Integer> num = new ArrayList<>();
	public List<List<Integer>> combine(int n, int k) {
           dfs(1, n, k);
           return nums;
	}
	public  void dfs(int i, int n, int k) {
		if(num.size() + n - i + 1 < k) return;//剪枝
		if(num.size() == k) {
		  nums.add(new ArrayList<Integer>(num));
		  return;
		}//重要的事情最先做
		
		num.add(i);//装
		dfs(i + 1, n, k);
		num.remove(num.size() - 1);//回溯(不装)
		dfs(i + 1, n, k);
	}
}

组合(力扣)dfs + 回溯 + 剪枝 JAVA,leetcode,深度优先,剪枝文章来源地址https://www.toymoban.com/news/detail-565150.html

到了这里,关于组合(力扣)dfs + 回溯 + 剪枝 JAVA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣】216. 组合总和 III <回溯、回溯剪枝>

    找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字 1 到 9,每个数字最多使用一次,返回所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]] 解释: 1 + 2 + 4 = 7 没有其他符合的组合

    2024年02月10日
    浏览(38)
  • 【算法】递归、回溯、剪枝、dfs 算法题练习(组合、排列、总和问题;C++)

    后面的练习是接着下面链接中的文章所继续的,在对后面的题练习之前,可以先将下面的的文章进行了解👇: 【算法】{画决策树 + dfs + 递归 + 回溯 + 剪枝} 解决排列、子集问题(C++) 思路 题意分析 :要求根据给出的数字,算出合法的括号组成个数。根据题目,我们可以总

    2024年02月22日
    浏览(50)
  • LeetCode 39. 组合总和(回溯+剪枝)

    链接:LeetCode 39. 组合总和 难度:中等 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选

    2024年02月14日
    浏览(45)
  • 递归专题训练详解(回溯,剪枝,深度优先)

    在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出

    2024年02月07日
    浏览(47)
  • LeetCode刷题13:回溯+剪枝解决216.组合总和 III

    找出所有相加之和为  n   的  k   个数的组合,且满足下列条件: 只使用数字1到9 每个数字  最多使用一次   返回  所有可能的有效组合的列表  。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]] 解释: 1 + 2 + 4 = 7 没有其他

    2024年02月02日
    浏览(44)
  • DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)

    目录 那年深夏 引入 1.什么是深度优先搜索(DFS)? 2.什么是栈? 3.什么是递归? 图解过程  问题示例 1、全排列问题 2、迷宫问题 3、棋盘问题(N皇后)  4、加法分解 模板 剪枝 1.简介 2.剪枝的原则   3.剪枝策略的寻找的方法 4.常见剪枝方法 最后 他终于抬起头,眨了眨眼睛

    2023年04月08日
    浏览(46)
  • leetcode(力扣) 剑指 Offer 12. 矩阵中的路径(回溯 DFS)

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    2024年02月14日
    浏览(47)
  • 力扣--深度优先算法/回溯算法47.全排列 Ⅱ

    思路分析: 使用DFS算法进行全排列,递归地尝试每个可能的排列方式。 使用 path 向量保存当前正在生成的排列,当其大小达到输入数组的大小时,将其加入结果集。 使用 numvisited 向量标记每个数字是否已经被访问过,以确保每个数字在一个排列中只使用一次。 在递归过程中

    2024年03月13日
    浏览(51)
  • DFS(基础,回溯,剪枝,记忆化)搜索

    DFS(深度优先搜索) 基于递归求解问题,而针对搜索的过程 对于问题的介入状态叫初始状态,要求的状态叫目标状态 这里的搜索就是对实时产生的状态进行分析检测,直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态的过程叫扩展 搜索的要点: 1.选定初

    2024年04月12日
    浏览(36)
  • DFS:深搜+回溯+剪枝解决排列、子集问题

                                        创作不易,感谢三连支持!!  . - 力扣(LeetCode) . - 力扣(LeetCode)  方案1:不合法就continue 方案2:合法才能进循环 . - 力扣(LeetCode) . - 力扣(LeetCode)  策略1:决策树以选不选作为参考,结果为叶子节点 策略2:决策树以选几个

    2024年04月16日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包