Showing posts with label BFS. Show all posts
Showing posts with label BFS. Show all posts

Wednesday, April 24, 2013

word ladder(C++ code)

LeetCode Word Ladder, Feb 11
Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary
For example,
Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]
As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.
Note:
  • Return 0 if there is no such transformation sequence.
  • All words have the same length.
  • All words contain only lowercase alphabetic characters.
思路:bfs,我用map来记录每个单词的depth的,大集合用了1932ms...其实不需要用map,可以用两个int记录当前层和下一层的节点数,当前层用完后,当前层移到下一层,下一层则重设为0,同时update depth。这样稍微快一点,1.4s左右。。

  1. int ladderLength(string start, string end, unordered_set<string> &dict) {    
  2.     
  3.         if(start == end) return 1;    
  4.         //prev counts words of current level, next counts for next level, depth denotes current level.  
  5.         //same level means same distance from original word.  
  6.         int depth = 1, prev =1, next = 0;     
  7.         //queue stores intermediate words  
  8.         queue<string> q;    
  9.      
  10.         q.push(start);    
  11.         //set stores visited words to avoid redundant work.  
  12.         unordered_set<string> visited;    
  13.     
  14.         visited.insert(start);    
  15.     
  16.   while(!q.empty()) {    
  17.     
  18.     string cur = q.front();    
  19.     
  20.     q.pop(); prev--;    
  21.     //for each letter in the intermediate word, iterate over 26 options and push it into queue if it's a word,   
  22.     //don't forget to update level count next.   
  23.     for(int i = 0; i < cur.length(); i++){    
  24.     
  25.        for(int j = 0; j < 26; j++){    
  26.     
  27.          string mid = cur;    
  28.     
  29.          mid[i] = 'a' + j;    
  30.     
  31.          if(dict.find(mid) != dict.end() && visited.find(mid) == visited.end()){    
  32.     
  33.            visited.insert(mid);    
  34.     
  35.            q.push(mid);    
  36.     
  37.            next += 1;    
  38.     
  39.            if(mid == end) return depth + 1;    
  40.          }    
  41.        }     
  42.    }    
  43.     
  44.   if(prev == 0) {prev = next; next = 0; depth++;}    
  45.    
  46.   }    
  47.         return 0;    
  48. }    
-------------用map的---------------

int ladderLength(string start, string end, unordered_set<string> &dict) {

        if(start == end) return 1;
        map<string,int> visited;

        queue<string> q;

        q.push(start);

        visited[start] = 1;

      

while(!q.empty()) {

    string cur = q.front();

    q.pop();

   for(int i = 0; i < cur.length(); i++){

       for(int j = 0; j < 26; j++){

         string mid = cur;

         mid[i] = 'a' + j;

         if(mid == end) return visited[cur] + 1;

         if(dict.find(mid) != dict.end() && visited.find(mid) == visited.end()){

           visited[mid] = visited[cur] + 1;

           q.push(mid);

     

         }

       }

   }
}

        return 0;
    }

Friday, April 19, 2013

graph split (C++)

2维0,1矩阵。判断有多少个封闭的全是0的area。DFS,BFS的方法都要写。

void dfs(const vector<vector<int>> &G, int i, int j){
  if(i<0 || i >= rown || j<0 || j >= coln) return;
  if(G[i][j] == 1 || visited[i][j] == 1) return;
  visited[i][j] = 1;
  dfs(G, i - 1, j);
  dfs(G, i + 1, j);
  dfs(G, i, j+1);
  dfs(G, i, j-1);
}

int count(vector<vector<int>>G){
  if(G.empty()) return 0;
  int count;
 int rown = G.size(), coln = G[0].size;
 vector<vector<int>> visited(rown, vector<int>(coln,0));
  for(i = 0; i < rown; i++) {
    for(j = 0; j < coln; j++){
      if(visited[i][j] == 0&& G[i][j] == 0) {  
            count++;
          dfs(G,i, j, rown, coln);
        }
      }
    }

return count;

}

-------------------
void bfs(const vector<vector<int>> &G, int i, int j){
  queqe<pair<int,int>> q;
  q.push(make_pair(i,j));
  while(!q.empty()){
     i = queue.front().first; j = queue.front().second;
     queue.pop();
     visited[i][j] = 1;
     if(i > 0 && visited[i-1][j] == 0 && G[i-1][j] == 0) queue.push(make_pair(i-1,j));
     if(j> 0 && visited[i][j-1] == 0 && G[i][j-1] == 0) queue.push(make_pair(i,j-1));
     if(i < rown - 1 && visited[i+1][j] == 0 && G[i+1][j] == 0) queue.push(make_pair(i+1,j));
     if(j < coln - 1 && visited[i][j+1] == 0&& G[i][j+1] == 0) queue.push(make_pair(i,j+1));
  }
 

}


int count(vector<vector<int>>G){
  if(G.empty()) return 0;
  int count;
 int rown = G.size(), coln = G[0].size;
 vector<vector<int>> visited(rown, vector<int>(coln,0));
  for(i = 0; i < rown; i++) {
    for(j = 0; j < coln; j++){
      if(visited[i][j] == 0&& G[i][j] == 0) {  
            count++;
          bfs(G,i, j, rown, coln);
        }
      }
    }

return count;

}

Monday, April 8, 2013

Binary Tree Zigzag Level Order Traversal (C++ code)

LeetCode Binary Tree Zigzag Level Order Traversal, Sep 29 '12
难度4,出现频率3
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7
return its zigzag level order traversal as:

[
  [3],
  [20,9],
  [15,7]
]
 
思路: 跟level order traversal一致,只是多一个flag记录每层正向还是逆向。

  1. vector<vector<int>> zigzagLevelOrder(TreeNode *root){  
  2.   vector<vector<int>> res;  
  3.   if(!root) return res;   
  4.   vector<int> level;  
  5.   queue<TreeNode *> myque;  
  6.   bool flag = true;   
  7.   TreeNode *last = root;  
  8.   myque.push(root);   
  9.   //main loop  
  10.   while(!myque.empty()){  
  11.    root = myque.front();  
  12.    myque.pop();  
  13.    if(root->left) myque.push(root->left);  
  14.    if(root->right) myque.push(root->right);  
  15.    if(flag == true)level.push_back(root->val);  
  16.    else level.insert(level.begin(), root->val);  
  17.    //when current level ends, store level in result, reset flag and level variable.  
  18.    if(root == last){  
  19.      res.push_back(level);  
  20.      level.clear();  
  21.      last = myque.back();  
  22.      flag = !flag;   
  23.    }   
  24.   }  
  25.   return res;   
  26. }   

Sunday, April 7, 2013

Binary Tree Level Order Traversal I, II(C++ code)

LeetCode Binary Tree Level Order Traversal,Sep 29 
 难度3,出现频率4
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7},
return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
].
 
思路: 辅助数据结构queue,每次从头pop一个node, 后面就push node's children.这里要求每层单存一个list,
所以记得用一个指针last记录每层的最后一个node,每当遍历到last时,更新last为当前queue的末尾。
Code如下:

vector<vector<int>> levelOrder(TreeNode *root){
  vector<vector<int>> res;
  if(!root) return res;
  queue<TreeNode *> myque;
  vector<int> level;
  TreeNode *last = root;
  myque.push(root);

  while(!myque.empty()){
     root = myque.front();
     myque.pop();
     level.push_back(root->val);
    if(root->left) myque.push(root->left);
    if(root->right) myque.push(root->right);
    
    if(root == last) {
     last = myque.back();
     res.push_back(level);
     level.clear();
    }
  }
  
  return res;
} 


Binary Tree Level Order Traversal II, Oct 1 '12
难度3,出现频率1
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7
return its bottom-up level order traversal as:

[
  [15,7]
  [9,20],
  [3],
]

思路: 从上题基本一样,只是每个level存进result的时候,是从头存进去。

vector<vector<int>> levelOrder(TreeNode *root){
  vector<vector<int>> res;
  if(!root) return res;
  queue<TreeNode *> myque;
  vector<int> level;
  TreeNode *last = root;
  myque.push(root);

  while(!myque.empty()){
     root = myque.front();
     myque.pop();
     level.push_back(root->val);
    if(root->left) myque.push(root->left);
    if(root->right) myque.push(root->right);
    
    if(root == last) {
     last = myque.back();
     res.insert(res.begin(),level);
     level.clear();
    }
  }
  
  return res;
}