@@ -2017,8 +2017,8 @@
< li class = "md-nav__item" >
< a href = "../../chapter_dynamic_programming/dp_solution_pipeline.md " class = "md-nav__link" >
13.3. DP 解题步骤 ( New)
< a href = "../../chapter_dynamic_programming/dp_solution_pipeline/ " class = "md-nav__link" >
13.3. DP 解题思路 ( New)
< / a >
< / li >
@@ -2426,9 +2426,36 @@
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
< div class = "highlight" > < span class = "filename" > subset_sum_i_naive.swift< / span > < pre > < span > < / span > < code > < a id = "__codelineno-8-1" name = "__codelineno-8-1" href = "#__codelineno-8-1" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "kd" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > backtrack< / span > < span class = "p" > } < / span >
< a id = "__codelineno-8-2" name = "__codelineno-8-2" href = "#__codelineno-8-2" > < / a >
< a id = "__codelineno-8-3" name = "__codelineno-8-3" href = "#__codelineno-8-3" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p " > [< / span > < span class = "kd" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > subsetSumINaive< / span > < span class = "p" > } < / span >
< div class = "highlight" > < span class = "filename" > subset_sum_i_naive.swift< / span > < pre > < span > < / span > < code > < a id = "__codelineno-8-1" name = "__codelineno-8-1" href = "#__codelineno-8-1" > < / a > < span class = "cm" > /* 回溯算法:子集和 I */ < / span >
< a id = "__codelineno-8-2" name = "__codelineno-8-2" href = "#__codelineno-8-2" > < / a > < span class = "kd" > func< / span > < span class = "nf" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > ,< / span > < span class = "n" > total< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > ,< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]])< / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-3" name = "__codelineno-8-3" href = "#__codelineno-8-3" > < / a > < span class = "c1 " > // 子集和等于 target 时,记录解 < / span >
< a id = "__codelineno-8-4" name = "__codelineno-8-4" href = "#__codelineno-8-4" > < / a > < span class = "k" > if< / span > < span class = "n" > total< / span > < span class = "p" > ==< / span > < span class = "n" > target< / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-5" name = "__codelineno-8-5" href = "#__codelineno-8-5" > < / a > < span class = "n" > res< / span > < span class = "p" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > )< / span >
< a id = "__codelineno-8-6" name = "__codelineno-8-6" href = "#__codelineno-8-6" > < / a > < span class = "k" > return< / span >
< a id = "__codelineno-8-7" name = "__codelineno-8-7" href = "#__codelineno-8-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-8-8" name = "__codelineno-8-8" href = "#__codelineno-8-8" > < / a > < span class = "c1" > // 遍历所有选择< / span >
< a id = "__codelineno-8-9" name = "__codelineno-8-9" href = "#__codelineno-8-9" > < / a > < span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "k" > in< / span > < span class = "bp" > stride< / span > < span class = "p" > (< / span > < span class = "n" > from< / span > < span class = "p" > :< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "n" > to< / span > < span class = "p" > :< / span > < span class = "n" > choices< / span > < span class = "p" > .< / span > < span class = "bp" > count< / span > < span class = "p" > ,< / span > < span class = "n" > by< / span > < span class = "p" > :< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-10" name = "__codelineno-8-10" href = "#__codelineno-8-10" > < / a > < span class = "c1" > // 剪枝:若子集和超过 target ,则跳过该选择< / span >
< a id = "__codelineno-8-11" name = "__codelineno-8-11" href = "#__codelineno-8-11" > < / a > < span class = "k" > if< / span > < span class = "n" > total< / span > < span class = "o" > +< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span > < span class = "o" > > < / span > < span class = "n" > target< / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-12" name = "__codelineno-8-12" href = "#__codelineno-8-12" > < / a > < span class = "k" > continue< / span >
< a id = "__codelineno-8-13" name = "__codelineno-8-13" href = "#__codelineno-8-13" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-8-14" name = "__codelineno-8-14" href = "#__codelineno-8-14" > < / a > < span class = "c1" > // 尝试:做出选择,更新元素和 total< / span >
< a id = "__codelineno-8-15" name = "__codelineno-8-15" href = "#__codelineno-8-15" > < / a > < span class = "n" > state< / span > < span class = "p" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ])< / span >
< a id = "__codelineno-8-16" name = "__codelineno-8-16" href = "#__codelineno-8-16" > < / a > < span class = "c1" > // 进行下一轮选择< / span >
< a id = "__codelineno-8-17" name = "__codelineno-8-17" href = "#__codelineno-8-17" > < / a > < span class = "n" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > state< / span > < span class = "p" > ,< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "n" > target< / span > < span class = "p" > ,< / span > < span class = "n" > total< / span > < span class = "p" > :< / span > < span class = "n" > total< / span > < span class = "o" > +< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ],< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "n" > choices< / span > < span class = "p" > ,< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > res< / span > < span class = "p" > )< / span >
< a id = "__codelineno-8-18" name = "__codelineno-8-18" href = "#__codelineno-8-18" > < / a > < span class = "c1" > // 回退:撤销选择,恢复到之前的状态< / span >
< a id = "__codelineno-8-19" name = "__codelineno-8-19" href = "#__codelineno-8-19" > < / a > < span class = "n" > state< / span > < span class = "p" > .< / span > < span class = "bp" > removeLast< / span > < span class = "p" > ()< / span >
< a id = "__codelineno-8-20" name = "__codelineno-8-20" href = "#__codelineno-8-20" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-8-21" name = "__codelineno-8-21" href = "#__codelineno-8-21" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-8-22" name = "__codelineno-8-22" href = "#__codelineno-8-22" > < / a >
< a id = "__codelineno-8-23" name = "__codelineno-8-23" href = "#__codelineno-8-23" > < / a > < span class = "cm" > /* 求解子集和 I( 包含重复子集) */< / span >
< a id = "__codelineno-8-24" name = "__codelineno-8-24" href = "#__codelineno-8-24" > < / a > < span class = "kd" > func< / span > < span class = "nf" > subsetSumINaive< / span > < span class = "p" > (< / span > < span class = "n" > nums< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > )< / span > < span class = "p" > -> < / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]]< / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-25" name = "__codelineno-8-25" href = "#__codelineno-8-25" > < / a > < span class = "kd" > var< / span > < span class = "nv" > state< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ]< / span > < span class = "p" > =< / span > < span class = "p" > []< / span > < span class = "c1" > // 状态(子集)< / span >
< a id = "__codelineno-8-26" name = "__codelineno-8-26" href = "#__codelineno-8-26" > < / a > < span class = "kd" > let< / span > < span class = "nv" > total< / span > < span class = "p" > =< / span > < span class = "mi" > 0< / span > < span class = "c1" > // 子集和< / span >
< a id = "__codelineno-8-27" name = "__codelineno-8-27" href = "#__codelineno-8-27" > < / a > < span class = "kd" > var< / span > < span class = "nv" > res< / span > < span class = "p" > :< / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]]< / span > < span class = "p" > =< / span > < span class = "p" > []< / span > < span class = "c1" > // 结果列表(子集列表)< / span >
< a id = "__codelineno-8-28" name = "__codelineno-8-28" href = "#__codelineno-8-28" > < / a > < span class = "n" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > state< / span > < span class = "p" > ,< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "n" > target< / span > < span class = "p" > ,< / span > < span class = "n" > total< / span > < span class = "p" > :< / span > < span class = "n" > total< / span > < span class = "p" > ,< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "n" > nums< / span > < span class = "p" > ,< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > res< / span > < span class = "p" > )< / span >
< a id = "__codelineno-8-29" name = "__codelineno-8-29" href = "#__codelineno-8-29" > < / a > < span class = "k" > return< / span > < span class = "n" > res< / span >
< a id = "__codelineno-8-30" name = "__codelineno-8-30" href = "#__codelineno-8-30" > < / a > < span class = "p" > }< / span >
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
@@ -2666,9 +2693,39 @@
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
< div class = "highlight" > < span class = "filename" > subset_sum_i.swift< / span > < pre > < span > < / span > < code > < a id = "__codelineno-19-1" name = "__codelineno-19-1" href = "#__codelineno-19-1" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "kd" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > backtrack< / span > < span class = "p" > } < / span >
< a id = "__codelineno-19-2" name = "__codelineno-19-2" href = "#__codelineno-19-2" > < / a >
< a id = "__codelineno-19-3" name = "__codelineno-19-3" href = "#__codelineno-19-3" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "kd" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > subsetSumI< / span > < span class = "p" > }< / span >
< div class = "highlight" > < span class = "filename" > subset_sum_i.swift< / span > < pre > < span > < / span > < code > < a id = "__codelineno-19-1" name = "__codelineno-19-1" href = "#__codelineno-19-1" > < / a > < span class = "cm" > /* 回溯算法:子集和 I */ < / span >
< a id = "__codelineno-19-2" name = "__codelineno-19-2" href = "#__codelineno-19-2" > < / a > < span class = "kd" > func< / span > < span class = "nf" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > ,< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > start< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > ,< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]])< / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-3" name = "__codelineno-19-3" href = "#__codelineno-19-3" > < / a > < span class = "c1" > // 子集和等于 target 时,记录解 < / span >
< a id = "__codelineno-19-4" name = "__codelineno-19-4" href = "#__codelineno-19-4" > < / a > < span class = "k" > if< / span > < span class = "n" > target< / span > < span class = "p" > ==< / span > < span class = "mi" > 0< / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-5" name = "__codelineno-19-5" href = "#__codelineno-19-5" > < / a > < span class = "n" > res< / span > < span class = "p" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > )< / span >
< a id = "__codelineno-19-6" name = "__codelineno-19-6" href = "#__codelineno-19-6" > < / a > < span class = "k" > return< / span >
< a id = "__codelineno-19-7" name = "__codelineno-19-7" href = "#__codelineno-19-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-19-8" name = "__codelineno-19-8" href = "#__codelineno-19-8" > < / a > < span class = "c1" > // 遍历所有选择< / span >
< a id = "__codelineno-19-9" name = "__codelineno-19-9" href = "#__codelineno-19-9" > < / a > < span class = "c1" > // 剪枝二:从 start 开始遍历,避免生成重复子集< / span >
< a id = "__codelineno-19-10" name = "__codelineno-19-10" href = "#__codelineno-19-10" > < / a > < span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "k" > in< / span > < span class = "bp" > stride< / span > < span class = "p" > (< / span > < span class = "n" > from< / span > < span class = "p" > :< / span > < span class = "n" > start< / span > < span class = "p" > ,< / span > < span class = "n" > to< / span > < span class = "p" > :< / span > < span class = "n" > choices< / span > < span class = "p" > .< / span > < span class = "bp" > count< / span > < span class = "p" > ,< / span > < span class = "n" > by< / span > < span class = "p" > :< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-11" name = "__codelineno-19-11" href = "#__codelineno-19-11" > < / a > < span class = "c1" > // 剪枝一:若子集和超过 target ,则直接结束循环< / span >
< a id = "__codelineno-19-12" name = "__codelineno-19-12" href = "#__codelineno-19-12" > < / a > < span class = "c1" > // 这是因为数组已排序,后边元素更大,子集和一定超过 target< / span >
< a id = "__codelineno-19-13" name = "__codelineno-19-13" href = "#__codelineno-19-13" > < / a > < span class = "k" > if< / span > < span class = "n" > target< / span > < span class = "o" > -< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span > < span class = "o" > < < / span > < span class = "mi" > 0< / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-14" name = "__codelineno-19-14" href = "#__codelineno-19-14" > < / a > < span class = "k" > break< / span >
< a id = "__codelineno-19-15" name = "__codelineno-19-15" href = "#__codelineno-19-15" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-19-16" name = "__codelineno-19-16" href = "#__codelineno-19-16" > < / a > < span class = "c1" > // 尝试:做出选择,更新 target, start< / span >
< a id = "__codelineno-19-17" name = "__codelineno-19-17" href = "#__codelineno-19-17" > < / a > < span class = "n" > state< / span > < span class = "p" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ])< / span >
< a id = "__codelineno-19-18" name = "__codelineno-19-18" href = "#__codelineno-19-18" > < / a > < span class = "c1" > // 进行下一轮选择< / span >
< a id = "__codelineno-19-19" name = "__codelineno-19-19" href = "#__codelineno-19-19" > < / a > < span class = "n" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > state< / span > < span class = "p" > ,< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "n" > target< / span > < span class = "o" > -< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ],< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "n" > choices< / span > < span class = "p" > ,< / span > < span class = "n" > start< / span > < span class = "p" > :< / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > res< / span > < span class = "p" > )< / span >
< a id = "__codelineno-19-20" name = "__codelineno-19-20" href = "#__codelineno-19-20" > < / a > < span class = "c1" > // 回退:撤销选择,恢复到之前的状态< / span >
< a id = "__codelineno-19-21" name = "__codelineno-19-21" href = "#__codelineno-19-21" > < / a > < span class = "n" > state< / span > < span class = "p" > .< / span > < span class = "bp" > removeLast< / span > < span class = "p" > ()< / span >
< a id = "__codelineno-19-22" name = "__codelineno-19-22" href = "#__codelineno-19-22" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-19-23" name = "__codelineno-19-23" href = "#__codelineno-19-23" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-19-24" name = "__codelineno-19-24" href = "#__codelineno-19-24" > < / a >
< a id = "__codelineno-19-25" name = "__codelineno-19-25" href = "#__codelineno-19-25" > < / a > < span class = "cm" > /* 求解子集和 I */< / span >
< a id = "__codelineno-19-26" name = "__codelineno-19-26" href = "#__codelineno-19-26" > < / a > < span class = "kd" > func< / span > < span class = "nf" > subsetSumI< / span > < span class = "p" > (< / span > < span class = "n" > nums< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > )< / span > < span class = "p" > -> < / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]]< / span > < span class = "p" > {< / span >
< a id = "__codelineno-19-27" name = "__codelineno-19-27" href = "#__codelineno-19-27" > < / a > < span class = "kd" > var< / span > < span class = "nv" > state< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ]< / span > < span class = "p" > =< / span > < span class = "p" > []< / span > < span class = "c1" > // 状态(子集)< / span >
< a id = "__codelineno-19-28" name = "__codelineno-19-28" href = "#__codelineno-19-28" > < / a > < span class = "kd" > let< / span > < span class = "nv" > nums< / span > < span class = "p" > =< / span > < span class = "n" > nums< / span > < span class = "p" > .< / span > < span class = "bp" > sorted< / span > < span class = "p" > ()< / span > < span class = "c1" > // 对 nums 进行排序< / span >
< a id = "__codelineno-19-29" name = "__codelineno-19-29" href = "#__codelineno-19-29" > < / a > < span class = "kd" > let< / span > < span class = "nv" > start< / span > < span class = "p" > =< / span > < span class = "mi" > 0< / span > < span class = "c1" > // 遍历起始点< / span >
< a id = "__codelineno-19-30" name = "__codelineno-19-30" href = "#__codelineno-19-30" > < / a > < span class = "kd" > var< / span > < span class = "nv" > res< / span > < span class = "p" > :< / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]]< / span > < span class = "p" > =< / span > < span class = "p" > []< / span > < span class = "c1" > // 结果列表(子集列表)< / span >
< a id = "__codelineno-19-31" name = "__codelineno-19-31" href = "#__codelineno-19-31" > < / a > < span class = "n" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > state< / span > < span class = "p" > ,< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "n" > target< / span > < span class = "p" > ,< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "n" > nums< / span > < span class = "p" > ,< / span > < span class = "n" > start< / span > < span class = "p" > :< / span > < span class = "n" > start< / span > < span class = "p" > ,< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > res< / span > < span class = "p" > )< / span >
< a id = "__codelineno-19-32" name = "__codelineno-19-32" href = "#__codelineno-19-32" > < / a > < span class = "k" > return< / span > < span class = "n" > res< / span >
< a id = "__codelineno-19-33" name = "__codelineno-19-33" href = "#__codelineno-19-33" > < / a > < span class = "p" > }< / span >
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
@@ -2923,9 +2980,44 @@
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
< div class = "highlight" > < span class = "filename" > subset_sum_ii.swift< / span > < pre > < span > < / span > < code > < a id = "__codelineno-30-1" name = "__codelineno-30-1" href = "#__codelineno-30-1" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "kd" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > backtrack< / span > < span class = "p" > } < / span >
< a id = "__codelineno-30-2" name = "__codelineno-30-2" href = "#__codelineno-30-2" > < / a >
< a id = "__codelineno-30-3" name = "__codelineno-30-3" href = "#__codelineno-30-3" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "kd" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > subsetSumII< / span > < span class = "p" > }< / span >
< div class = "highlight" > < span class = "filename" > subset_sum_ii.swift< / span > < pre > < span > < / span > < code > < a id = "__codelineno-30-1" name = "__codelineno-30-1" href = "#__codelineno-30-1" > < / a > < span class = "cm" > /* 回溯算法:子集和 II */ < / span >
< a id = "__codelineno-30-2" name = "__codelineno-30-2" href = "#__codelineno-30-2" > < / a > < span class = "kd" > func< / span > < span class = "nf" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > ,< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > start< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > ,< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]])< / span > < span class = "p" > {< / span >
< a id = "__codelineno-30-3" name = "__codelineno-30-3" href = "#__codelineno-30-3" > < / a > < span class = "c1" > // 子集和等于 target 时,记录解 < / span >
< a id = "__codelineno-30-4" name = "__codelineno-30-4" href = "#__codelineno-30-4" > < / a > < span class = "k" > if< / span > < span class = "n" > target< / span > < span class = "p" > ==< / span > < span class = "mi" > 0< / span > < span class = "p" > {< / span >
< a id = "__codelineno-30-5" name = "__codelineno-30-5" href = "#__codelineno-30-5" > < / a > < span class = "n" > res< / span > < span class = "p" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > )< / span >
< a id = "__codelineno-30-6" name = "__codelineno-30-6" href = "#__codelineno-30-6" > < / a > < span class = "k" > return< / span >
< a id = "__codelineno-30-7" name = "__codelineno-30-7" href = "#__codelineno-30-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-30-8" name = "__codelineno-30-8" href = "#__codelineno-30-8" > < / a > < span class = "c1" > // 遍历所有选择< / span >
< a id = "__codelineno-30-9" name = "__codelineno-30-9" href = "#__codelineno-30-9" > < / a > < span class = "c1" > // 剪枝二:从 start 开始遍历,避免生成重复子集< / span >
< a id = "__codelineno-30-10" name = "__codelineno-30-10" href = "#__codelineno-30-10" > < / a > < span class = "c1" > // 剪枝三:从 start 开始遍历,避免重复选择同一元素< / span >
< a id = "__codelineno-30-11" name = "__codelineno-30-11" href = "#__codelineno-30-11" > < / a > < span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "k" > in< / span > < span class = "bp" > stride< / span > < span class = "p" > (< / span > < span class = "n" > from< / span > < span class = "p" > :< / span > < span class = "n" > start< / span > < span class = "p" > ,< / span > < span class = "n" > to< / span > < span class = "p" > :< / span > < span class = "n" > choices< / span > < span class = "p" > .< / span > < span class = "bp" > count< / span > < span class = "p" > ,< / span > < span class = "n" > by< / span > < span class = "p" > :< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "p" > {< / span >
< a id = "__codelineno-30-12" name = "__codelineno-30-12" href = "#__codelineno-30-12" > < / a > < span class = "c1" > // 剪枝一:若子集和超过 target ,则直接结束循环< / span >
< a id = "__codelineno-30-13" name = "__codelineno-30-13" href = "#__codelineno-30-13" > < / a > < span class = "c1" > // 这是因为数组已排序,后边元素更大,子集和一定超过 target< / span >
< a id = "__codelineno-30-14" name = "__codelineno-30-14" href = "#__codelineno-30-14" > < / a > < span class = "k" > if< / span > < span class = "n" > target< / span > < span class = "o" > -< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span > < span class = "o" > < < / span > < span class = "mi" > 0< / span > < span class = "p" > {< / span >
< a id = "__codelineno-30-15" name = "__codelineno-30-15" href = "#__codelineno-30-15" > < / a > < span class = "k" > break< / span >
< a id = "__codelineno-30-16" name = "__codelineno-30-16" href = "#__codelineno-30-16" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-30-17" name = "__codelineno-30-17" href = "#__codelineno-30-17" > < / a > < span class = "c1" > // 剪枝四:如果该元素与左边元素相等,说明该搜索分支重复,直接跳过< / span >
< a id = "__codelineno-30-18" name = "__codelineno-30-18" href = "#__codelineno-30-18" > < / a > < span class = "k" > if< / span > < span class = "n" > i< / span > < span class = "o" > > < / span > < span class = "n" > start< / span > < span class = "p" > ,< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span > < span class = "p" > ==< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]< / span > < span class = "p" > {< / span >
< a id = "__codelineno-30-19" name = "__codelineno-30-19" href = "#__codelineno-30-19" > < / a > < span class = "k" > continue< / span >
< a id = "__codelineno-30-20" name = "__codelineno-30-20" href = "#__codelineno-30-20" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-30-21" name = "__codelineno-30-21" href = "#__codelineno-30-21" > < / a > < span class = "c1" > // 尝试:做出选择,更新 target, start< / span >
< a id = "__codelineno-30-22" name = "__codelineno-30-22" href = "#__codelineno-30-22" > < / a > < span class = "n" > state< / span > < span class = "p" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ])< / span >
< a id = "__codelineno-30-23" name = "__codelineno-30-23" href = "#__codelineno-30-23" > < / a > < span class = "c1" > // 进行下一轮选择< / span >
< a id = "__codelineno-30-24" name = "__codelineno-30-24" href = "#__codelineno-30-24" > < / a > < span class = "n" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > state< / span > < span class = "p" > ,< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "n" > target< / span > < span class = "o" > -< / span > < span class = "n" > choices< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ],< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "n" > choices< / span > < span class = "p" > ,< / span > < span class = "n" > start< / span > < span class = "p" > :< / span > < span class = "n" > i< / span > < span class = "o" > +< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > res< / span > < span class = "p" > )< / span >
< a id = "__codelineno-30-25" name = "__codelineno-30-25" href = "#__codelineno-30-25" > < / a > < span class = "c1" > // 回退:撤销选择,恢复到之前的状态< / span >
< a id = "__codelineno-30-26" name = "__codelineno-30-26" href = "#__codelineno-30-26" > < / a > < span class = "n" > state< / span > < span class = "p" > .< / span > < span class = "bp" > removeLast< / span > < span class = "p" > ()< / span >
< a id = "__codelineno-30-27" name = "__codelineno-30-27" href = "#__codelineno-30-27" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-30-28" name = "__codelineno-30-28" href = "#__codelineno-30-28" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-30-29" name = "__codelineno-30-29" href = "#__codelineno-30-29" > < / a >
< a id = "__codelineno-30-30" name = "__codelineno-30-30" href = "#__codelineno-30-30" > < / a > < span class = "cm" > /* 求解子集和 II */< / span >
< a id = "__codelineno-30-31" name = "__codelineno-30-31" href = "#__codelineno-30-31" > < / a > < span class = "kd" > func< / span > < span class = "nf" > subsetSumII< / span > < span class = "p" > (< / span > < span class = "n" > nums< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > )< / span > < span class = "p" > -> < / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]]< / span > < span class = "p" > {< / span >
< a id = "__codelineno-30-32" name = "__codelineno-30-32" href = "#__codelineno-30-32" > < / a > < span class = "kd" > var< / span > < span class = "nv" > state< / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ]< / span > < span class = "p" > =< / span > < span class = "p" > []< / span > < span class = "c1" > // 状态(子集)< / span >
< a id = "__codelineno-30-33" name = "__codelineno-30-33" href = "#__codelineno-30-33" > < / a > < span class = "kd" > let< / span > < span class = "nv" > nums< / span > < span class = "p" > =< / span > < span class = "n" > nums< / span > < span class = "p" > .< / span > < span class = "bp" > sorted< / span > < span class = "p" > ()< / span > < span class = "c1" > // 对 nums 进行排序< / span >
< a id = "__codelineno-30-34" name = "__codelineno-30-34" href = "#__codelineno-30-34" > < / a > < span class = "kd" > let< / span > < span class = "nv" > start< / span > < span class = "p" > =< / span > < span class = "mi" > 0< / span > < span class = "c1" > // 遍历起始点< / span >
< a id = "__codelineno-30-35" name = "__codelineno-30-35" href = "#__codelineno-30-35" > < / a > < span class = "kd" > var< / span > < span class = "nv" > res< / span > < span class = "p" > :< / span > < span class = "p" > [[< / span > < span class = "nb" > Int< / span > < span class = "p" > ]]< / span > < span class = "p" > =< / span > < span class = "p" > []< / span > < span class = "c1" > // 结果列表(子集列表)< / span >
< a id = "__codelineno-30-36" name = "__codelineno-30-36" href = "#__codelineno-30-36" > < / a > < span class = "n" > backtrack< / span > < span class = "p" > (< / span > < span class = "n" > state< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > state< / span > < span class = "p" > ,< / span > < span class = "n" > target< / span > < span class = "p" > :< / span > < span class = "n" > target< / span > < span class = "p" > ,< / span > < span class = "n" > choices< / span > < span class = "p" > :< / span > < span class = "n" > nums< / span > < span class = "p" > ,< / span > < span class = "n" > start< / span > < span class = "p" > :< / span > < span class = "n" > start< / span > < span class = "p" > ,< / span > < span class = "n" > res< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > res< / span > < span class = "p" > )< / span >
< a id = "__codelineno-30-37" name = "__codelineno-30-37" href = "#__codelineno-30-37" > < / a > < span class = "k" > return< / span > < span class = "n" > res< / span >
< a id = "__codelineno-30-38" name = "__codelineno-30-38" href = "#__codelineno-30-38" > < / a > < span class = "p" > }< / span >
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >