组合问题:为什么用start避免重复

好问题!让我详细解释"用start避免重复"的含义。

组合问题:为什么需要start?

组合的定义 :选出k个数,顺序无关

  • 1,22,1同一个组合

如果不用start会怎样?

c 复制代码
// ❌ 错误:没有start限制
void dfs(int n, int k, int *path, int pathSize, ...) {
    if (pathSize == k) {
        保存path;
        return;
    }
    
    for (int i = 1; i <= n; i++) {  // 每次都从1开始
        if (!visited[i]) {
            path[pathSize] = i;
            dfs(n, k, path, pathSize+1, ...);
        }
    }
}

// n=4, k=2
// 会生成:[1,2], [2,1], [1,3], [3,1], ... 重复!

✅ 用start避免重复

c 复制代码
void dfs(int n, int k, int start, int *path, int pathSize, ...) {
    if (pathSize == k) {
        保存path;
        return;
    }
    
    for (int i = start; i <= n; i++) {  // 从start开始,不回头
        path[pathSize] = i;
        dfs(n, k, i + 1, path, pathSize+1, ...);  // 下次从i+1开始
    }
}

关键i + 1 保证后面的数字永远比前面大

图解说明

n=4, k=2,用start

复制代码
DFS树(用start):
           []
    /      |     |    \
   1       2     3     4
  /|\      |\     |
 2 3 4     3 4    4

生成:
[1,2], [1,3], [1,4]  ← 从1开始,后面只选2,3,4
[2,3], [2,4]         ← 从2开始,后面只选3,4
[3,4]                ← 从3开始,后面只选4

✅ 无重复:[2,1]不会出现,因为选了2后,start=3,不会回头选1

没有start

复制代码
DFS树(没有start):
              []
      /   /   |   \   \
     1   2    3    4
   / |\ |\  /|\ /|\
  1 234 12 123 123...

生成:
[1,2], [1,3], [1,4]
[2,1], [2,3], [2,4]  ← ❌ [2,1]是重复的
[3,1], [3,2], [3,4]  ← ❌ [3,1],[3,2]是重复的
...

总结

start的作用

  • 保证每次只从当前数字后面
  • 避免选到前面的数字
  • 自然地保证:path[0] < path[1] < path[2] < ...
  • 因此 1,2 会生成,但 2,1 不会生成

记忆

复制代码
组合:顺序无关 → 用start保证递增 → 避免重复
排列:顺序相关 → 用visited避免重用 → 允许任意顺序

这就是为什么组合用start,而全排列用visited!

相关推荐
稚南城才子,乌衣巷风流16 分钟前
长链剖分(Long Chain Decomposition)算法详解
算法·深度优先·图论
变量未定义~28 分钟前
环境治理、染色时间、小蓝组网
算法
Ulyanov1 小时前
雷达导引头仿真中的坐标系——从惯性系到量测角
开发语言·python·算法·系统仿真·雷达信号处理·雷达导引头
玖玥拾1 小时前
LeetCode 13 罗马数字转整数
笔记·算法·leetcode
m沐沐1 小时前
【计算机视觉】OpenCV 物体跟踪——原理、算法与CSRT跟踪器实战
人工智能·python·深度学习·opencv·算法·计算机视觉·人脸识别
怪奇云呼军2 小时前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app
稚南城才子,乌衣巷风流2 小时前
树链剖分(树剖)算法详解:从原理到实现
算法·深度优先
北方的银狐-Zero2 小时前
OntoL对标Palantir功能简介-视频版
人工智能·图论·本体论
jz_ddk2 小时前
[信号处理] 数学与工程之美:相邻差分共轭乘积
数学·算法·信号处理·差分·共轭
m沐沐11 小时前
【深度学习】YOLOv2目标检测算法——改进点、网络结构与聚类先验框解析
人工智能·pytorch·深度学习·算法·yolo·目标检测·transformer