给定一个不含重复数字的数组nums,返回其所有可能的全排列 。按照任意顺序返回答案

输入

1 2 3

输出

1 2 3 
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

#include <iostream>
using namespace std;

const int N = 10;
int nums[N];       // 存储输入的原始数组(从命令行读入)
int n = 0;         // 记录数组实际长度
int path[N];       // 当前构造的排列
bool state[N];     // 标记某个数字是否被用过(值为true表示已用)

// 深度优先搜索函数:递归构造排列
void dfs(int u) {
    // 终止条件:当前已经放了n个数字,排列完成
    if (u == n) {
        for (int i = 0; i < n; i++) cout << path[i] << " ";
        cout << endl;
        return;
    }

    // 枚举当前这一层可以选择的每个数字
    for (int i = 0; i < n; i++) {
        // nums[i] 这个值如果没被用过,就可以放入当前位置
        if (!state[nums[i]]) {
            path[u] = nums[i];            // 把 nums[i] 放在当前排列的第 u 个位置
            state[nums[i]] = true;        // 标记这个数已经被使用了

            dfs(u + 1);                   直到u==n,return进入下一步

            state[nums[i]] = false;       // 回溯:恢复现场,把这个数字释放掉,让别的路径可以用
        }
    }
}

int main() {
    // 从命令行读取一行数字,存入 nums 数组
    while (cin >> nums[n]) n++;

    dfs(0); // 从第0个位置开始填数字

    return 0;
}
 

 

题目内容

给你一个整数数组nums,数组中的元素互不相同 。返回该数组所有可能的子集(幂集)。

解集不能包含重复的子集。按照任意顺序返回解集。

样例1

输入

1 2 3

输出

1
1 2
1 2 3
1 3 
2
2 3
3

 

#include <iostream>
using namespace std;

const int N = 10;
int nums[N];    // 存储输入的整数数组
int path[N];    // 存储当前构造的子集(递归中选的数)
int n = 0;      // 实际输入的数字个数(数组长度)

// 深度优先搜索函数
// u 表示当前从 nums[u] 开始往后选数
// k 表示当前 path[] 中已经选了多少个数(也是 path 的长

 void dfs(int u, int k) {
    for (int i = 0; i < k; i++) {
        cout << path[i] << " ";
    }
    cout << endl;

注意这里:i=u。  path[k] = nums[i]; dfs(i+1,k+1)

    // ✅ 从 u 开始枚举后续的数(防止重复)
    for (int i = u; i < n; i++) {
        path[k] = nums[i];        // 把 nums[i] 当前构造的末尾


        dfs(i + 1, k + 1);        // 递归到下一层,从 i+1 位置继续选,path 长度加 1
    }
}

int main() {
    // ✅ 动态读取用户输入(直到换行结束)
    while (cin >> nums[n]) n++;

    // ✅ 从第 0 个数开始构造子集,path 初始长度为 0
    dfs(0, 0);

    return 0;
}
 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐