mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-12 15:36:05 +00:00
build
This commit is contained in:
@@ -15,7 +15,7 @@ comments: true
|
||||
- 输入集合中的元素可以被无限次重复选取。
|
||||
- 子集是不区分元素顺序的,比如 $\{4, 5\}$ 和 $\{5, 4\}$ 是同一个子集。
|
||||
|
||||
### 参考全排列解法
|
||||
### 1. 参考全排列解法
|
||||
|
||||
类似于全排列问题,我们可以把子集的生成过程想象成一系列选择的结果,并在选择过程中实时更新“元素和”,当元素和等于 `target` 时,就将子集记录至结果列表。
|
||||
|
||||
@@ -445,7 +445,7 @@ comments: true
|
||||
- 当数组元素较多,尤其是当 `target` 较大时,搜索过程会产生大量的重复子集。
|
||||
- 比较子集(数组)的异同非常耗时,需要先排序数组,再比较数组中每个元素的异同。
|
||||
|
||||
### 重复子集剪枝
|
||||
### 2. 重复子集剪枝
|
||||
|
||||
**我们考虑在搜索过程中通过剪枝进行去重**。观察下图,重复子集是在以不同顺序选择数组元素时产生的,具体来看:
|
||||
|
||||
@@ -464,7 +464,7 @@ comments: true
|
||||
|
||||
总结来看,给定输入数组 $[x_1, x_2, \cdots, x_n]$ ,设搜索过程中的选择序列为 $[x_{i_1}, x_{i_2}, \cdots , x_{i_m}]$ ,则该选择序列需要满足 $i_1 \leq i_2 \leq \cdots \leq i_m$ ,**不满足该条件的选择序列都会造成重复,应当剪枝**。
|
||||
|
||||
### 代码实现
|
||||
### 3. 代码实现
|
||||
|
||||
为实现该剪枝,我们初始化变量 `start` ,用于指示遍历起点。**当做出选择 $x_{i}$ 后,设定下一轮从索引 $i$ 开始遍历**。这样做就可以让选择序列满足 $i_1 \leq i_2 \leq \cdots \leq i_m$ ,从而保证子集唯一。
|
||||
|
||||
@@ -932,13 +932,13 @@ comments: true
|
||||
|
||||
<p align="center"> 图:相等元素导致的重复子集 </p>
|
||||
|
||||
### 相等元素剪枝
|
||||
### 1. 相等元素剪枝
|
||||
|
||||
为解决此问题,**我们需要限制相等元素在每一轮中只被选择一次**。实现方式比较巧妙:由于数组是已排序的,因此相等元素都是相邻的。这意味着在某轮选择中,若当前元素与其左边元素相等,则说明它已经被选择过,因此直接跳过当前元素。
|
||||
|
||||
与此同时,**本题规定中的每个数组元素只能被选择一次**。幸运的是,我们也可以利用变量 `start` 来满足该约束:当做出选择 $x_{i}$ 后,设定下一轮从索引 $i + 1$ 开始向后遍历。这样即能去除重复子集,也能避免重复选择元素。
|
||||
|
||||
### 代码实现
|
||||
### 2. 代码实现
|
||||
|
||||
=== "Java"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user