• (LeetCode C++)全排列


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

    示例 1:

    1. 输入:nums = [1,2,3]
    2. 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

    示例 2:

    1. 输入:nums = [0,1]
    2. 输出:[[0,1],[1,0]]

    示例 3:

    1. 输入:nums = [1]
    2. 输出:[[1]]

    提示:

    1. 1 <= nums.length <= 6
    2. -10 <= nums[i] <= 10
    3. nums 中的所有整数 互不相同

    Method:

            由于排列问题会使用到所有的元素,因此需要设置一个use_flag数组来记录元素是否被使用过,在遍历时,需要跳过已经使用的元素。

            使用回溯法来遍历不同的排列,回溯的终止条件是:缓存temp的大小等于nums的大小,说明搜索到了叶节点,保存结果后返回。

    Code:

    1. class Solution{
    2. public:
    3. // 全排列
    4. // 使用回溯法遍历所有可能的排列方式
    5. void Recall(vector<int> &nums, vector<int> &temp, vectorint>> &result, vector<bool> &use_flag){
    6. // 如果当前缓存的结果长度等于给定的数组长度
    7. if(temp.size()==nums.size()){
    8. // 则回溯结束
    9. // 记录当前缓存的结果
    10. result.push_back(temp);
    11. }
    12. // 从0开始遍历给定的数组
    13. for(int i=0;isize();i++){
    14. // 如果当前数字已经被使用
    15. if(use_flag[i]==true){
    16. // 则跳过该数字
    17. continue;
    18. }
    19. // 如果当前数字未被使用
    20. // 将当前数字设置为已使用
    21. use_flag[i]=true;
    22. // 将当前数字加入缓存中
    23. temp.push_back(nums[i]);
    24. // 回溯搜索接下来的排列
    25. Recall(nums, temp, result, use_flag);
    26. // 搜索完毕后将该数字移出缓存
    27. temp.pop_back();
    28. // 取消该数字的使用记录
    29. use_flag[i]=false;
    30. }
    31. }
    32. // 全排列
    33. vectorint>> permute(vector<int> &nums){
    34. // 记录所有结果
    35. vectorint>> result;
    36. // 临时保存一组结果
    37. vector<int> temp;
    38. // 记录数组中的数是否被使用
    39. vector<bool> use_flag(nums.size(),false);
    40. // 如果给定数组的长度为1
    41. if(nums.size()==1){
    42. // 则最终结果只有一种可能
    43. temp.push_back(nums[0]);
    44. result.push_back(temp);
    45. }
    46. else{
    47. // 如果给定数组的长度大于1
    48. // 则开始回溯所有可能的排列方式
    49. Recall(nums, temp, result, use_flag);
    50. }
    51. return result;
    52. }
    53. };

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/permutations

    Reference:

    LeetCode-全排列(C++)_海螺蜜的博客-CSDN博客_全排列leetcode

  • 相关阅读:
    信息学奥赛一本通 2074:【21CSPJ普及组】分糖果(candy) | 洛谷 P7909 [CSP-J 2021] 分糖果
    你读过哪些让你醍醐灌顶的 Java 代码?
    java 中 返回一个空Map
    MySQL 多表查询 事务 索引
    如何在python中实现capl语言里的回调函数
    Java --- Spring6前的程序问题
    认证服务------功能实现逻辑
    程序员第一课“hello word”,你知道网工第一课吗?
    电子器件 电阻参数与选型
    VUE 笔记 202211
  • 原文地址:https://blog.csdn.net/qq_40728667/article/details/126919073