目录
这个专栏写得很顺畅
一、没有重复项数字的全排列

无重复->暴力枚举,check剪枝
牛客这边好像类内成员属性不给初始化的,所以将其设置为全局变量。
            
            
              cpp
              
              
            
          
          #include <vector>
bool check[7];
vector<int> path;
vector<vector<int>> ret;
int _n;
class Solution {
public:
    vector<vector<int> > permute(vector<int>& num) {
        _n=num.size();
        //题目要求
        sort(num.begin(),num.end());
        dfs(num);
        return ret;
    }
    void dfs(vector<int>&num)
    {
        if(path.size()==_n)
        {
            ret.push_back(path);
            return;
        }
        for(int i=0;i<_n;++i)
        {
            if(!check[i])
            {
                check[i]=true;
                path.push_back(num[i]);
                dfs(num);
                check[i]=false;
                path.pop_back();
            }
        }
    }
};
        二、有重复项数字的全排列

有重复?排序+check分层判断
            
            
              cpp
              
              
            
          
          bool check[9];
int _n;
vector<int> path;
vector<vector<int>> ret;
class Solution {
public:
    vector<vector<int> > permuteUnique(vector<int>& num) {
        _n=num.size();
        sort(num.begin(),num.end());
        dfs(num);
        return ret;
    }
    void dfs(vector<int>&num)
    {
        if(path.size()==_n)
        {
            ret.push_back(path);
            return;
        }
        for(int i=0;i<_n;++i)
        {
            if(!check[i])
            {
                if(i==0||num[i]!=num[i-1]||check[i-1])
                {
                    check[i]=true;
                    path.push_back(num[i]);
                    dfs(num);
                    path.pop_back();
                    check[i]=false;
                }
            }
        }
    }
};
        三、岛屿数量


check标记
            
            
              cpp
              
              
            
          
          class Solution {
    int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},m,n;
    bool check[301][301];
public:
    int solve(vector<vector<char>>& grid) {
        m=grid.size(),n=grid[0].size();
        int ret=0;
        for(int i=0;i<m;++i)
        {
            for(int j=0;j<n;++j)
            {
                if(grid[i][j]=='1'&&!check[i][j])
                {
                    ++ret;
                    //check!
                    dfs(grid,i,j);
                }
            }
        }
        return ret;
    }
    void dfs(vector<vector<char>>& grid,int i,int j)
    {
        check[i][j]=true;
        for(int k=0;k<4;++k)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]=='1'&&!check[x][y])
            {
                dfs(grid,x,y);
            }
        }
    }
};
        四、字符串的排列


其实就是有重复元素全排列
            
            
              cpp
              
              
            
          
          int _n;
string path;
vector<string> ret;
bool check[11];
class Solution {
public:
    vector<string> Permutation(string str) {
        _n=str.size();
        sort(str.begin(),str.end());
        dfs(str);
        return ret;
    }
    void dfs(string str)
    {
        if(path.size()==_n)
        {
            ret.push_back(path);
            return;
        }
        for(int i=0;i<_n;++i)
        {
            if(!check[i])
            {
                if(i==0||str[i]!=str[i-1]||check[i-1])
                {
                    check[i]=true;
                    path.push_back(str[i]);
                    dfs(str);
                    path.pop_back();
                    check[i]=false;
                }
            }
        }
    }
};
        五、N皇后


题意要求特判
递归该层处理该行
            
            
              cpp
              
              
            
          
          int _n;
bool Col[10],Dig1[20],Dig2[20];
int ret;
class Solution {
public:
    int Nqueen(int n) {
        _n=n;
        dfs(0);
        return ret;
    }
    void dfs(int row)
    {
        if(row==_n)
        {
            ++ret;
            return;
        }
        for(int col=0;col<_n;++col)
        {
            if(!Col[col]&&!Dig1[row-col+_n]&&!Dig2[row+col])
            {
                Col[col]=Dig1[row-col+_n]=Dig2[row+col]=true;
                dfs(row+1);
                Col[col]=Dig1[row-col+_n]=Dig2[row+col]=false;
            }
        }
    }
};
        六、括号生成

依旧是根据题目要求,写特殊判断
            
            
              cpp
              
              
            
          
          int _n;
string path;
vector<string> ret;
class Solution {
public:
    vector<string> generateParenthesis(int n) {
        _n=n;
        dfs(0,0);
        return ret;
    }
    //dfs每层保证右括号数量<=左括号数量,并且二者数量都不能超过n
    void dfs(int LeftNum,int RightNum)
    {
        if(RightNum==_n)
        {
            ret.push_back(path);
            return;
        }
        if(LeftNum<_n)
        {
            path.push_back('(');
            dfs(LeftNum+1,RightNum);
            path.pop_back();
        }
        if(RightNum<LeftNum)
        {
            path.push_back(')');
            dfs(LeftNum,RightNum+1);
            path.pop_back();
        }
    }
};
        七、矩阵最长递增路径


dfs+记忆化搜索
            
            
              cpp
              
              
            
          
          #include <vector>
int memo[1001][1001],dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int _m,_n,ret;
class Solution {
public:
    int solve(vector<vector<int> >& matrix) {
        _m=matrix.size(),_n=matrix[0].size();
        for(int i=0;i<_m;++i)
        {
            for(int j=0;j<_n;++j)
            {
                ret=max(ret,dfs(matrix,i,j));
            }
        }
        return ret;
    }
    int dfs(vector<vector<int>>&matrix,int i,int j)
    {
        if(memo[i][j])return memo[i][j];
        int path=1;
        for(int k=0;k<4;++k)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0&&x<_m&&y>=0&&y<_n&&matrix[x][y]>matrix[i][j])
            {
                path=max(path,dfs(matrix,x,y)+1);
            }
        }
        memo[i][j]=path;
        return path;
    }
};
        此篇完。
最轻松的一个专栏,*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。