mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
@ -287,6 +287,7 @@ function subsets(nums: number[]): number[][] {
|
|||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
|
|
||||||
|
思路一:使用本题的标准解法,递归回溯。
|
||||||
```Rust
|
```Rust
|
||||||
impl Solution {
|
impl Solution {
|
||||||
fn backtracking(result: &mut Vec<Vec<i32>>, path: &mut Vec<i32>, nums: &Vec<i32>, start_index: usize) {
|
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
|
### C
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user