zoukankan      html  css  js  c++  java
  • Leetcode题解(25)

    77. Combinations

    题目

    分析:求给定数字n,k的组合数,方法是采用深度搜索算法,代码如下(copy网上代码)

     1 class Solution {
     2 public:
     3     void dfs77(vector<vector<int > > &ans, vector<int> subans, int start, int n, int k)
     4     {
     5         if (subans.size() == k)
     6         {
     7             ans.push_back(subans); return ;
     8         }
     9         for (int i = start; i <= n; i++)
    10         {
    11             subans.push_back(i);
    12             dfs77(ans, subans, i + 1, n, k);
    13             subans.pop_back(); // 满足一个条件或者该分支递归完后要删除最后一个
    14         }
    15     }
    16     vector<vector<int> > combine(int n, int k) {
    17         vector<vector<int > > ans;
    18         if (n < k || k == 0) return ans;
    19         vector<int> subans;
    20         dfs77(ans, subans, 1, n, k);
    21         return ans;
    22     }
    23 };

     --------------------------------------------------------------------------------分割线------------------------------------------------------------------

    78. Subsets

    题目

    分析:求一个集合的所有子集,代码如下(copy网上代码)

     1 class Solution {
     2 public:
     3     vector<vector<int>>res;
     4     vector<int>ans;
     5     vector<vector<int>> subsets(vector<int>& nums) {
     6         if(nums.empty()) return res;
     7         sort(nums.begin(), nums.end());
     8         dfs(0, ans, nums);
     9         return res;
    10      
    11     }
    12     void dfs(int k, vector<int>ans, vector<int> nums){
    13         res.push_back(ans);
    14         for(int i = k; i < nums.size(); i++){
    15             ans.push_back(nums[i]);
    16             dfs(i + 1, ans, nums);
    17             ans.pop_back();
    18         }
    19     }
    20 };

     --------------------------------------------------------------------------------------分割线------------------------------------------------------------

    79. Word Search

    题目

    分析:看到这类题目,首先就应该想到“回溯法”,代码如下,具体思路见注释:

      1 class Solution {
      2     public:
      3     int m,n;
      4 public:
      5     bool exist(vector<vector<char>>& board, string word) {
      6         if(""==word)
      7             return true;
      8         m=board.size();
      9         n=board[0].size();
     10         vector<vector<bool>> flag(m,vector<bool>(n,false));
     11         for(int i=0;i<m;i++)
     12         {
     13             for(int j=0;j<n;j++)
     14             {
     15                 if(board[i][j]==word[0])
     16                 {
     17                     flag[i][j]=true;
     18                     if(HuiSu(board,i,j,word,0,flag))
     19                         return true;
     20                     else
     21                         flag[i][j]=false;
     22                     
     23                     
     24                     
     25                 }
     26             }
     27         }
     28         return false;
     29     }
     30     
     31     bool HuiSu(const vector<vector<char>>& board,int i,int j,const string& word,int index,vector<vector<bool>>& flag)
     32     {
     33         if(word[index+1] == '')
     34             return true;
     35         
     36         int ii,jj;
     37         ii=i;
     38         jj=j+1;
     39         bool temp;
     40         if(isTrue(ii,jj))//向右
     41         {
     42             if(flag[ii][jj] == false && board[ii][jj] == word[index+1])
     43             {
     44                 flag[ii][jj] = true;
     45                 temp = HuiSu(board,ii,jj,word,index+1,flag);
     46                 if(temp)
     47                     return true;
     48                 flag[ii][jj] = false;//这一步很重要
     49             }
     50         }
     51         
     52         ii=i;
     53         jj=j-1;
     54         if(isTrue(ii,jj))//向左
     55         {
     56             if(flag[ii][jj] == false && board[ii][jj] == word[index+1])
     57             {
     58                 flag[ii][jj] = true;
     59                 temp = HuiSu(board,ii,jj,word,index+1,flag);
     60                 if(temp)
     61                     return true;
     62                 flag[ii][jj] = false;
     63             }
     64         }
     65         
     66         ii=i-1;
     67         jj=j;
     68         if(isTrue(ii,jj))//向上
     69         {
     70             if(flag[ii][jj] == false && board[ii][jj] == word[index+1])
     71             {
     72                 flag[ii][jj] = true;
     73                 temp = HuiSu(board,ii,jj,word,index+1,flag);
     74                 if(temp)
     75                     return true;
     76                 flag[ii][jj] = false;
     77             }
     78         }
     79         
     80         ii=i+1;
     81         jj=j;
     82         if(isTrue(ii,jj))//向下
     83         {
     84             if(flag[ii][jj] == false && board[ii][jj] == word[index+1])
     85             {
     86                 flag[ii][jj] = true;
     87                 temp = HuiSu(board,ii,jj,word,index+1,flag);
     88                 if(temp)
     89                     return true;
     90                 flag[ii][jj] = false;
     91             }
     92         }
     93         
     94         
     95         return false;
     96     }
     97     
     98     bool isTrue(int i,int j)
     99     {
    100         if(i<0)
    101             return false;
    102         else if(i>=m)
    103             return false;
    104         else if(j<0)
    105             return false;
    106         else if(j>=n)
    107             return false;
    108         
    109         return true;
    110     }
    111 };
  • 相关阅读:
    Grand Central Dispatch-thread pool pattern
    POSIX Threads
    Event-driven programming-main loop
    Data type-数据类型
    软件的动与静
    对封装好的视图进行动态修改
    编程语言进化
    Type system
    Run-time type information--RTTI
    Type system-Type checking
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/5175677.html
Copyright © 2011-2022 走看看