• 力扣每日一题46:全排列


    题目描述:

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    提示:

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

    通过次数

    944.6K

    提交次数

    1.2M

    通过率

    79.0%

    思路和题解:

    就是给你n个不重复的数字,让你把这些数字的所有排列情况给返回。

    方法一:用next_permutation函数

    c++在头文件里有个函数next_permutation,可以将按字母表生成的给定序列的下一个较大的排列,直到整个序列为降序为止。所以我们可以先将nums数组升序排序,排好后再使用next_permutation将每一种排序赋给返回值即可。记住刚开始一定要先给nums数组排序排成最小的,否则不会输出比nums更小的排序。

    1. class Solution {
    2. public:
    3. vectorint>> permute(vector<int>& nums) {
    4. vectorint>> ans;
    5. sort(nums.begin(),nums.end());
    6. do{
    7. ans.emplace_back(nums);
    8. }while(next_permutation(nums.begin(),nums.end()));
    9. return ans;
    10. }
    11. };

    方法二:回溯法(递归法)

    回想以下我们高中的时候计算" role="presentation" style="position: relative;">Ann(就是n个不同东西的排列方式有几种)怎么算的。第一个位置n个选择,然后第二个位置剩下n-1个选择......最后一个位置只有一个选择,最终结果是n*(n-1)*(n-2)*......*1。用这个思想我们可以用递归的方法以此确定每个位置放置的数字,当某个位置放某个特定的数的排列排完后,就放其他没放过的数。

    代码:

    1. vector<int> Stack; //存放每一种标记
    2. int visited[7]; //对有没有用过第i个数进行标记
    3. class Solution {
    4. public:
    5. void dfs(vector<vector<int>>& ans,vector nums,int depth,int n)
    6. {
    7. if(depth==n)
    8. {//n个位置都选好了,就完成一次
    9. ans.emplace_back(Stack);
    10. return ;
    11. }
    12. for(int i=0;i<n;i++)
    13. {
    14. if(visited[i]==0)
    15. {
    16. //之前没有选过,现在就可以选了
    17. visited[i]=1;
    18. Stack.push_back(nums[i]);
    19. //选好depth这个位置后递归下一层选depth+1这个位置
    20. dfs(ans,nums,depth+1,n);
    21. //下一层递归结束后返回,depth这个位置重新选,堆栈的depth位置也抛出。即回溯
    22. //回溯的关键
    23. visited[i]=0;
    24. Stack.pop_back();
    25. }
    26. }
    27. }
    28. vector<vector<int>> permute(vector& nums) {
    29. int n=nums.size();
    30. vector<vector<int>> ans;
    31. for(int i=0;i<n;i++) visited[i]=0;
    32. dfs(ans,nums,0,n);
    33. return ans;
    34. }
    35. };

  • 相关阅读:
    frp 实现 http / tcp 内网穿透(穿透 wordpress )
    LeeCode AutoX-4 计算几何
    【PAT甲级】1061 Dating
    Kotlin高仿微信-第16篇-单聊-红包
    关于2023中国(济南)国际换热传热技术与应用展览会通知
    解决Android studio更换sdk地址后flutter项目显示no device selected
    进程与线程的区别
    第一篇 如何选择深度学习主机
    为什么会突然牙疼?
    适时而变,联创未来|2022数字技能职业教育生态研讨会圆满落幕
  • 原文地址:https://blog.csdn.net/m0_73441691/article/details/133895188