mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
添加0078.子集 Rust第二种思路实现
This commit is contained in:
@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user