zoukankan      html  css  js  c++  java
  • LeetCode 46 全排列

    题目:

    给定一个没有重复数字的序列,返回其所有可能的全排列。

    示例:

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

    解题思路:

    递归求解,难点在于输出一个排列后怎么回溯。
    记录当前序列的长度lever,当lever和nums长度相等时,即为一个排序out。
    使用visited数字来标识某点是否被访问过。
    以上的lever,out,visited都需要回溯。
    回溯的方法是:在递归语句前设定某状态,在递归语句后取消该状态。

    代码:

     1 class Solution {
     2 public:
     3     
     4     vector<vector<int>> permute(vector<int>& nums) {
     5         vector<vector<int>> ans;
     6         vector<int> out;
     7         vector<int> visited(nums.size(), 0);
     8         perDFS(nums,0,visited,out,ans);
     9         return ans;
    10     }
    11     
    12     void perDFS(vector<int> nums, int lever, vector<int> &visited, vector<int> &out, vector<vector<int>> &ans) {
    13         if(lever == nums.size()){
    14             ans.push_back(out);
    15             return ;
    16         }
    17         for(int i=0; i<nums.size(); ++i){
    18             if(visited[i])
    19                 continue;
    20             visited[i] = 1;   //1、递归函数前设定visited和out 为某状态
    21             out.push_back(nums[i]);
    22             perDFS(nums,lever+1,visited,out,ans); //2、递归语句,lever在参数中回溯了
    23             out.pop_back();   //3、递归函数后取消visited和out的某状态    
    24             visited[i] = 0;
    25         }
    26     }
    27 };
  • 相关阅读:
    Spring bean的自动装配
    JSP三大指令
    JSP九大内置对象
    Java异常的捕获顺序(多个catch)
    Integer.parseInt(s)和Integer.valueOf(s)之间的区别
    mysql忘记密码(MySQL5.7)
    java的四种内部类
    内存泄露查询
    深度优先和广度优先比较
    循环队列
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10674015.html
Copyright © 2011-2022 走看看