• leetcode 46. 全排列


    很经典很经典,虽然AC高但难度不小

    /**
    当前的排列结果level,总结果res,访问标志visit,
    边界,level达到n个数
    **/
    
    class Solution {
    public:
        vector<vector<int>> permute(vector<int>& nums) {
            if(nums.size()==0) return {};
            int len=nums.size();
            vector<vector<int>> res;
            vector<int> level;
            vector<int> visit(len,0);
            dfs(nums,res,level,visit);
            return res;
        }
        void dfs(vector<int>&nums,vector<vector<int>>&res,vector<int>&level,vector<int>&visit){
            if(level.size()==nums.size()){
                res.push_back(level);return;
            }
            for(int i=0;i<nums.size();i++){
                if(!visit[i]){
                    visit[i]=1;
                    level.push_back(nums[i]);
                    dfs(nums,res,level,visit);
                    visit[i]=0;
                    level.pop_back();
                }
            }
        }
    };

    采用深度优先搜索的代码(带注释)

    class Solution {
    public:
        vector<vector<int>> permute(vector<int>& nums) {
            vector<vector<int>> res;
            vector<int> temp,visited(nums.size(),0);
            sort(nums.begin(),nums.end());
            DFS(nums,0,visited,temp,res);
            return res;
        }
        void DFS(vector<int>& nums,int index,vector<int>& visited,vector<int>& temp,vector<vector<int>>& res){
            //递归边界,当一个排列的数达到n个后,即形成了一个排列
            if(index==nums.size()){res.push_back(temp);return;}
            //递归形式:输出以nums[i]为第一个数的所有排列,
            for(int i=0;i<nums.size();i++){
                if(visited[i]==0){
                    temp.push_back(nums[i]);
                    visited[i]=1;
                    //递归调用时,输出前(index+1)个数确定的所有排列
                    DFS(nums,index+1,visited,temp,res);
                    //递归调用时,前(index+1)个数确定的所有排列输出完成,将后面所用到的元素visited设为0,并将temp中第(index+1)个数删除,然后按顺序继续加入下一个没有被添加到temp中的数
                    temp.pop_back();
                    visited[i]=0;
                }
            }
        }
    };
  • 相关阅读:
    第13篇-通过InterpreterCodelet存储机器指令片段
    第12篇-认识CodeletMark
    第11篇-认识Stub与StubQueue
    第10篇-初始化模板表
    第9篇-字节码指令的定义
    Java虚拟机漫漫学习路,我终于悟了
    Unity真机连接profiler
    提取图片中文字方法
    登录锁定个人收藏代码
    java判断密码是否为复杂类型(同时包含大小写和数字)
  • 原文地址:https://www.cnblogs.com/joelwang/p/10699007.html
Copyright © 2020-2023  润新知