1、获取全排列

https://leetcode.com/problems/permutations/submissions/

按字典序输出:

这里用的是vector<int>,不是引用、指针,也就是说深层次中的递归不会影响到前面层vector中的数据。

class Solution {
public:
    vector<vector<int>>ans;
    void dfs(vector<int>arr, int k, int n) {
        if (k == n) {
            ans.push_back(arr);
            return;
        }
        for (int i = k; i < n; i++) {
            swap(arr[i], arr[k]);
            dfs(arr, k + , n);
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        //sort(nums.begin(), nums.end());     //如果输入顺序是非字典序,那么就一定要先排序一次。为了dfs中的 i = k ~ n 的循环,swap(arr[i],arr[k]),得到的 n-k 个序列是满足字典升序的。
        dfs(nums, , nums.size());
        return ans;
    }
};

这是算法教材书上的写法,理论上引用是会快一点的,这个vector<int>&arr也可以直接用int数组,这题数据量比较小,体现不出来。但是输出顺序非常之古怪,慎用。

class Solution {
public:
    vector<vector<int>>ans;
    void dfs(vector<int>&arr, int k, int n) {
        if (k == n) {
            ans.push_back(arr);
            return;
        }
        for (int i = k; i < n; i++) {
            swap(arr[i], arr[k]);
            dfs(arr, k + , n);
            swap(arr[i], arr[k]);
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        dfs(nums, , nums.size());
        return ans;
    }
};

2、输出不重复的排列方式

https://leetcode.com/problems/permutations-ii/

深搜去重:

DFS中,如果第i个和第k个是相同的,就不往下进行搜索了,去除掉了出现重复的可能性。

class Solution {
public:
    vector<vector<int>> ans;
    void dfs(vector<int> nums, int n, int k) {
        if (k == n) {
            ans.push_back(nums);
            return;
        }
        for (int i = k; i < n; ++i) {
            if (i != k && nums[i] == nums[k]) continue;
            swap(nums[k], nums[i]);
            dfs(nums, n, k + );
        }
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        dfs(nums, nums.size(), );
        return ans;
    }
};

STL: next_permutation

next_permutation: 对于给定的任意一种全排列,给出能求出下一个全排列的情况。默认不会有重复序列出现的。

如果仍然有下一个全排列,返回true,给出下一个全排列;

否则返回false,给出第一个全排列;

因为可能出现的重复序列,让我们无法预知结果的个数,就必须先排序,从头做到尾。

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>>ans;
        sort(nums.begin(), nums.end());
        do {
            ans.push_back(nums);
        } while (next_permutation(nums.begin(), nums.end()));
        return ans;
    }
};

3、按字典序得到下一个全排列

https://leetcode.com/problems/next-permutation/submissions/

STL: next_permutation

这个题目,好像就是为next_permutation量身定做的一样。但其实效果比较一般。

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        next_permutation(nums.begin(), nums.end());
            ; i < nums.size(); i++) {
                printf("%d ",nums[i]);
            }
            printf("\n");
    }
};

正解:

LeetCode - 排列相关题目的更多相关文章

  1. leetcode tree相关题目总结

    leetcode tree相关题目小结 所使用的方法不外乎递归,DFS,BFS. 1. 题100 Same Tree Given two binary trees, write a function ...

  2. [LeetCode] [链表] 相关题目总结

    刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ...

  3. [LeetCode] 二叉树相关题目(不完全)

    最近在做LeetCode上面有关二叉树的题目,这篇博客仅用来记录这些题目的代码. 二叉树的题目,一般都是利用递归来解决的,因此这一类题目对理解递归很有帮助. 1.Symmetric Tree(http ...

  4. Leetcode回溯相关题目Python实现

    1.46题,全排列 https://leetcode-cn.com/problems/permutations/ class Solution(object): def permute(self, n ...

  5. [LeetCode] 链表反转相关题目

    暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...

  6. LeetCode: Palindrome 回文相关题目

    LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...

  7. leetcode - 位运算题目汇总(下)

    接上文leetcode - 位运算题目汇总(上),继续来切leetcode中Bit Manipulation下的题目. Bitwise AND of Numbers Range 给出一个范围,[m, ...

  8. leetcode top 100 题目汇总

    首先表达我对leetcode网站的感谢,与高校的OJ系统相比,leetcode上面的题目更贴近工作的需要,而且支持的语言广泛.对于一些比较困难的题目,可以从讨论区中学习别人的思路,这一点很方便. 经过 ...

  9. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

随机推荐

  1. Redis管道

    介绍 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.客户端请求会遵循以下步骤:客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应并将结果返 ...

  2. ModBus通信协议的【Modbus RTU 协议使用汇总】

    1.RTU模式 当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符.这种方式的主要优点是:在同样的波特率下,可比ASCII方式传 ...

  3. iomanip的作用 C++

    c++程序里面经常见到下面的头文件 #include <iomanip> 这里面iomanip的作用比较多: 主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,s ...

  4. sublime3 怎么快速自定义头部注释信息

    装一个DocBlockr插件 具体操作流程看文档:https://packagecontrol.io/packages/DocBlockr

  5. Python 练习:使用 * 输出直角三角形

    正方向 height = int(input("please input height: ")) tmp = 1 while tmp <= height: width = t ...

  6. PHP: Browser, Operating System (OS), Device, and Language Detect

    https://github.com/sinergi/php-browser-detector Device.php: <!DOCTYPE html> <html> <h ...

  7. The server quit without updating PID file (data mysql.pid)

     (1)mysql的安装路径和运行路径 # whereis mysqld   (2)PATH变量指定的路径中,搜索mysql的信息    #  which mysqld  (3)查看配置文件   # ...

  8. pycharm如何新项目如何不默认创建虚拟环境(吐槽)

    最近因为工作上的需要,琢磨了一下python,装了pycharm这个号称史上最好的编辑器,还没开始玩,就被整崩溃了. 因为我是刚开始玩这个,写了很多hello world,所以新建项目的时候很多,不知 ...

  9. Salesforce 小知识 - 必需字段

    将字段定义为"必需" 当我们为对象设置字段的属性时,我们需要让某些字段在建立记录的时候必需有值,比如定义一个"地址"对象,那么必须填入"邮编" ...

  10. Linux 学习笔记之超详细基础linux命令 Part 14

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...