回溯算法

回溯算法

 

组合问题

未剪枝优化

复制代码
import java.util.ArrayList;
import java.util.List;

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        int i = 0;
        backtracking(n,k,i);
        return result;
    }

    public void backtracking(int n, int k, int i){
        if (list.size() == k){
            result.add(new ArrayList<>(list));
            return;
        }
        for (int j = i + 1; j <= n; j++){
            list.add(j);
            backtracking(n,k,j);
            list.remove(list.size()-1);
        }
    }
}
复制代码

剪枝优化

 来举一个例子,n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了。 在第二层for循环,从元素3开始的遍历都没有意义了。

如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。

复制代码
import java.util.ArrayList;
import java.util.List;

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        int i = 0;
        backtracking(n,k,i);
        return result;
    }

    public void backtracking(int n, int k, int i){
        if (list.size() == k){
            result.add(new ArrayList<>(list));
            return;
        }
        for (int j = i + 1; j <= n-(k-list.size()) + 1; j++){ // 剪枝优化
            list.add(j);
            backtracking(n,k,j);
            list.remove(list.size()-1);
        }
    }
}
复制代码

 

posted on   gjwqz  阅读(3)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示