• (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

  • 相关阅读:
    ARMv7处理器
    鞋店小程序商城开发指南
    Spring Boot 设置上传文件大小限制
    编译安装 Python
    【开源】基于JAVA的智能停车场管理系统
    pipeline拉取代码-maven打包-sonar代码质量检测
    解决大众D评网站css加密改进说明
    如何安装HTMLTestRunner?
    两种K线形态预示今日伦敦银走向
    思维模型 正/反 木桶理论
  • 原文地址:https://blog.csdn.net/qq_40728667/article/details/126919073