中级农民
- 积分
- 109
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-1-14
- 最后登录
- 1970-1-1
|
6/17 https://leetcode.com/problems/surrounded-regions/
1) BFS + flag matrix 老老实实找需要被翻牌的:
- var solve = function(board) {
- if(!board || !board.length) return;
- const HEIGHT = board.length, WIDTH = board[0].length;
- const flag = [...Array(HEIGHT).keys()].map(key => Array(WIDTH).fill(0));
- for(let i=0; i<HEIGHT; i++) {
- for(let j=0; j<WIDTH; j++) {
- if(flag[i][j]) continue;
- if(board[i][j] === 'X') {
- flag[i][j] = 1;
- continue;
- }
- let queue = [], neighbors = [], surrounded = true;
- flag[i][j] = 1;
- queue.push([i, j]);
- while(queue.length) {
- let temp = [];
- neighbors = [...neighbors, ...queue];
- for(let k=0; k<queue.length; k++) {
- const [row, col] = queue[k];
- if(!row) surrounded = false;
- else if(!flag[row-1][col] && board[row-1][col] === 'O') {
- flag[row-1][col] = 1;
- temp.push([row-1, col]);
- }
- if(row === HEIGHT-1) surrounded = false;
- else if(!flag[row+1][col] && board[row+1][col] === 'O') {
- flag[row+1][col] = 1;
- temp.push([row+1, col]);
- }
- if(!col) surrounded = false;
- else if(!flag[row][col-1] && board[row][col-1] === 'O') {
- flag[row][col-1] = 1;
- temp.push([row, col-1]);
- }
- if(col === WIDTH-1) surrounded = false;
- else if(!flag[row][col+1] && board[row][col+1] === 'O') {
- flag[row][col+1] = 1;
- temp.push([row, col+1]);
- }
- }
- queue = temp;
- }
- if(surrounded) neighbors.forEach(([r, c]) => board[r][c] = 'X');
- }
- }
- };
复制代码
T: O(m * n)
S: O(m * n)
2) DFS w/ Optiomization 重点是要从边缘开始做dfs, 先mark出不应该被翻的再进行二次处理:
- var solve = function(board) {
- if(!board || !board.length) return;
- const HEIGHT = board.length, WIDTH = board[0].length;
- if(HEIGHT < 3 || WIDTH < 3) return;
- const queue = [];
- for(let i=0; i<HEIGHT; i++) {
- if(board[i][0] === 'O') dfs(board, i, 0);
- if(board[i][WIDTH-1] === 'O') dfs(board, i, WIDTH-1);
- }
- for(let j=1; j<WIDTH-1; j++) {
- if(board[0][j] === 'O') dfs(board, 0, j);
- if(board[HEIGHT-1][j] === 'O') dfs(board, HEIGHT-1, j);
- }
- for(let i=0; i<HEIGHT; i++) {
- for(let j=0; j<WIDTH; j++) {
- if(board[i][j] === 'A') board[i][j] = 'O';
- else if(board[i][j] === 'O') board[i][j] = 'X';
- }
- }
- };
- var dfs = function(board, row, col) {
- if(board[row][col] !== 'O') return;
- board[row][col] = 'A';
- if(row) dfs(board, row-1, col);
- if(row !== board.length-1) dfs(board, row+1, col);
- if(col) dfs(board, row, col-1);
- if(col !== board[0].length-1) dfs(board, row, col+1);
- }
复制代码
T: O(m * n)
S: worst-case O(m * n) |
|