Uriel's Corner

Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
posts - 0, comments - 50, trackbacks - 0, articles - 594

[LeetCode]Surrounded Regions-2014.01.17

Posted on 2014-01-17 18:16 Uriel 阅读(234) 评论(0)  编辑 收藏 引用 所属分类: LeetCode
做的想吐血的一题,交了33次才过,创纪录了...
题目很简单,就是一个字符阵,由X和O构成,找出所有O构成的连通区域,若该区域所有O都在字符阵内部(不在边界上),则把该连通区域所有O都换成X,其余不变

这题一看到就想着怎么这么裸的DFS,于是想也没想敲完直接RE,看RE返回的是空数据,于是加了判board为空的语句,交上去还是RE,因为之前做LeetCode这种RE的情况都是没有判空,于是换了N种写法判空,还是RE

因为是开了个数组记录字符阵每个元素是否访问过,又开了另一个数组判该连通区域是否邻边,想着是不是数组开太大了,于是试了各种数组大小,发现开bool型,只开一个数组能过,后来想到其实不需要另开一个数组记录是否邻边,搜的时候只搜四边上为O的那些位置,这样一定是邻边的,这个时间复杂度也小一些,于是改了,还是RE,而且挂在大数据上,但是我并没有开数组,不会有越界发生,然后就各种吐血的改来改去,终于AC,虽然还是很莫名...为啥之前会报RE呢?

这是AC的代码:

 1 class Solution {
 2 public:
 3     void DFS(int x, int y, vector<vector<char>> &board) {
 4         int tx, ty;
 5         if(x >= board.size() || y >= board[0].size() || x < 0 || y < 0 || board[x][y] != 'O') return;
 6         board[x][y] = 'Q';
 7         DFS(x, y + 1, board);
 8         DFS(x, y - 1, board);
 9         DFS(x + 1, y, board);
10         DFS(x - 1, y, board);
11     }
12     
13     void solve(vector<vector<char>> &board) {
14         if(board.empty()) return;
15         int row = board.size();
16         if(!row) return;
17         int col = board[0].size();
18         if(!col) return;
19         for(int i = 0; i < row; ++i) {
20             if(board[i][0] == 'O') DFS(i, 0, board);
21             if(board[i][col - 1] == 'O') DFS(i, col - 1, board);
22         }
23         for(int i = 0; i < col; ++i) {
24             if(board[0][i] == 'O') DFS(0, i, board);
25             if(board[row - 1][i] == 'O') DFS(row - 1, i, board);
26         }
27         for(int i = 0 ; i < row; ++i) {
28             for(int j = 0; j < col; ++j) {
29                 if(board[i][j] == 'Q') board[i][j] = 'O';
30                 else if(board[i][j] == 'O') board[i][j] = 'X';
31             }
32         }
33     }
34 
35 };

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理