回溯算法总结

回溯问题总结

回溯算法可以解决的问题大致分为以下几类:

  • 组合问题
  • 分割问题
  • 子集问题
  • 排列问题
  • 棋盘问题
  • 其它

组合问题

组合问题本身是不讲究顺序的,以下面这道题为例:

我们要选取的是k个组合,所以当path.size() == k时,就可以把当前遍历路径添加到结果中。

class 复制代码
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtrack(int startIndex, int n, int k) {
        if(path.size() == k) {
            result.push_back(path);
            return;
        }
        //for循环是同一个树层的不同分叉
        for(int i = startIndex; i <= n - (k - path.size()) + 1; i++) {
            path.push_back(i);
            //递归的过程是在同一个树杈上继续选择
            backtrack(i + 1, n, k);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtrack(1, n, k);
        return result;
    }
};

本题的关键是对于结果的去重。并且去重要求在同一层的不同树杈上进行去重

class 复制代码
public:
    vector<int> path;
    vector<vector<int>> result;
    int sum = 0;
    void backtrack(vector<int>& candidates, int target, int startIndex) {
        if(sum > target) return;
        if(sum == target) {
            result.push_back(path);
            return;
        }
        
        for(int i = startIndex; i < candidates.size(); i++) {
            if(i > startIndex && candidates[i] == candidates[i-1]) {
                continue;
            }
            sum += candidates[i];
            path.push_back(candidates[i]);
            backtrack(candidates, target, i + 1);
            path.pop_back();
            sum -= candidates[i];
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        backtrack(candidates, target, 0);
        return result;
    }
};
相关推荐
熊小猿4 小时前
在 Spring Boot 项目中使用分页插件的两种常见方式
java·spring boot·后端
paopaokaka_luck4 小时前
基于SpringBoot+Vue的助农扶贫平台(AI问答、WebSocket实时聊天、快递物流API、协同过滤算法、Echarts图形化分析、分享链接到微博)
java·vue.js·spring boot·后端·websocket·spring
小蒜学长5 小时前
springboot酒店客房管理系统设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
橙子家5 小时前
Serilog 日志库简单实践(一):文件系统 Sinks(.net8)
后端
Yeats_Liao6 小时前
Go Web 编程快速入门 13 - 部署与运维:Docker容器化、Kubernetes编排与CI/CD
运维·前端·后端·golang
Yeats_Liao6 小时前
Go Web 编程快速入门 14 - 性能优化与最佳实践:Go应用性能分析、内存管理、并发编程最佳实践
前端·后端·性能优化·golang
七夜zippoe7 小时前
仓颉语言核心特性深度解析——现代编程范式的集大成者
开发语言·后端·鸿蒙·鸿蒙系统·仓颉
软件架构师-叶秋7 小时前
spring boot入门篇之开发环境搭建
java·spring boot·后端
QX_hao8 小时前
【Go】--接口(interface)
开发语言·后端·golang
superman超哥8 小时前
仓颉语言中正则表达式引擎的深度剖析与实践
开发语言·后端·仓颉