添加0078.子集 Rust第二种思路实现

This commit is contained in:
kr
2024-07-01 15:12:42 +08:00
parent 7cbeff1209
commit db2fca022e

View File

@ -287,6 +287,7 @@ function subsets(nums: number[]): number[][] {
### Rust
思路一:使用本题的标准解法,递归回溯。
```Rust
impl Solution {
fn backtracking(result: &mut Vec<Vec<i32>>, path: &mut Vec<i32>, nums: &Vec<i32>, start_index: usize) {
@ -308,6 +309,30 @@ impl Solution {
}
}
```
思路二使用二进制枚举n个元素的子集问题一共是$2^n$种情况。如果我们使用一个二进制数字每一位根据0和1来决定是选取该元素与否那么一共也是$2^n$的情况,正好可以一一对应,所以我们可以不使用递归,直接利用循环枚举完成子集问题。
这种方法的优点在于效率高,不需要递归调用,并且代码容易编写。缺点则是过滤某些非法情况时会比递归方法难写一点,不过在子集问题中不存在这个问题。
```Rust
impl Solution {
pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
let n = nums.len();
// 预分配2^n空间
let mut result = Vec::with_capacity(1 << n);
// 二进制枚举2^n种情况
for i in 0..(1 << n) {
let mut subset = Vec::new();
for j in 0..n {
// 枚举该二进制数字的每一位
// 如果该位是1对应位置上的元素加入子集否则跳过
if i & (1 << j) != 0 {
subset.push(nums[j]);
}
}
result.push(subset);
}
result
}
}
```
### C