zoukankan      html  css  js  c++  java
  • [leetcode]Surrounded Regions

    有意思的题目,同样的代码,小数据,Java是600+ms,而C++就6ms。所以大数据Java超时。估计递归一多,Java的效率明显下降。

    1. 思路是从外圈往里做标记,标记活下来的cell;
    2. 因为螺旋打印很熟了,所以就螺旋的从外面往里面标记;
    3. 但是发现了一个问题,错误的标记了第三行第四个为'X',因为旋转的顺序,下面那个当时还没标记。
    OXXOX
    XOOXO
    XOXOX
    OXOOO
    XXOXO

    OXXOX
    XXXXO
    XXXXX
    OXOOO
    XXOXO
    4. 想到一个方法就是多转几圈,直到'#'的数字不变,但这个方法显然不够好,在3这个bad case的极端情况下,会循环很久;
    5. 看了一下网上,就是从边上开始,找到标记为'#'的cell后,开始DFS/BFS,标记相邻的'O';

    class Solution {
    public:
        void solve(vector<vector<char>> &board) {
            int m = board.size();
        	if (m == 0) return;
    		int n = board[0].size();
    		if (n == 0) return;
    		for (int i = 0; i < n; i++)
    		{
    			update(board, 0, i);
    		}
    		for (int i = 1; i < m; i++)
    		{
    			update(board, i, n-1);
    		}
    		for (int i = n-2; i >= 0; i--)
    		{
    			update(board, m-1, i);
    		}
    		for (int i = m-2; i >=1; i--)
    		{
    			update(board, i, 0);
    		}
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (board[i][j]=='#') board[i][j] = 'O';
                    else if (board[i][j] == 'O') board[i][j] = 'X';
                }
            }
        }
    	
    	void update(vector<vector<char>> &board, int i, int j)
    	{
    		if (i >= board.size() || j >= board[0].size()) return;
    		if (board[i][j] == 'O')
    		{
    			board[i][j] = '#';
    			update(board, i-1, j);
    			update(board, i+1, j);
    			update(board, i, j-1);
    			update(board, i, j+1);
    		}
    	}
    };
    

    第二刷

    class Solution {
    public:
        int N;
        int M;
        void solve(vector<vector<char>> &board)
        {
            if (board.empty() || board[0].empty()) return;
            N = board.size();
            M = board[0].size();
            for (int i = 0; i < N; i++)
                for (int j = 0; j < M; j++)
                {
                    if (i == 0 || j == 0 || i == N-1 || j == M-1)
                        probe(board, i, j);
                }
            for (int i = 0; i < N; i++)
                for (int j = 0; j < M; j++)
                {
                    if (board[i][j] != '.')
                        board[i][j] = 'X';
                    else
                        board[i][j] = 'O';
                }
        }
    
        void probe(vector<vector<char>> &board, int i, int j)
        {
            if (i < 0 || i >= N) return;
            if (j < 0 || j >= M) return;
            if (board[i][j] != 'O') return;
            board[i][j] = '.';
            probe(board, i-1, j);
            probe(board, i+1, j);
            probe(board, i, j-1);
            probe(board, i, j+1);
        }
    };
    

      

  • 相关阅读:
    November 07th, 2017 Week 45th Tuesday
    November 06th, 2017 Week 45th Monday
    November 05th, 2017 Week 45th Sunday
    November 04th, 2017 Week 44th Saturday
    November 03rd, 2017 Week 44th Friday
    Asp.net core 学习笔记 ( Area and Feature folder structure 文件结构 )
    图片方向 image orientation Exif
    Asp.net core 学习笔记 ( Router 路由 )
    Asp.net core 学习笔记 ( Configuration 配置 )
    qrcode render 二维码扫描读取
  • 原文地址:https://www.cnblogs.com/lautsie/p/3339804.html
Copyright © 2011-2022 走看看