回溯算法
回溯算法
组合问题
未剪枝优化
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); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具