用过的标记

10 分钟

全排列里最关键的一步,是记住哪些数已经被用掉了,否则会把同一个数填两次。用一个 used 数组:选中就置真,回溯时一定要置回假。

used[i] = true;      // 选 i,占用
perm[step] = i;
dfs(step + 1);
used[i] = false;     // 撤销,让后面别的分支还能选 i

那行 used[i] = false 是新手最容易漏的一句。漏了会怎样?第一个数一旦被某条分支用过,就永远停留在"已用"状态,别的分支再也选不到它,结果只能生成极少数几个排列,其余全被漏掉。记住:标记和撤销必须成对出现,有进就有出。

小纸条

不取消标记会漏掉什么?

登录 后可看答案

用过的标记 · 考级冲刺 · op599 课程