zoukankan      html  css  js  c++  java
  • Flood Fill 图染色

    题目描述
    现在有一个仅包含‘X’和‘O’的二维板,请捕获所有的被‘X’包围的区域
    捕获一个被包围区域的方法是将被包围区域中的所有‘O’变成‘X’
    例如
    X X X X
    X O O X
    X X O X
    O X X X
    执行完你给出的函数以后,这个二维板应该变成:
    X X X X
    X X X X
    X X X X
    O X X X

    
    
    
    
    
    #define dfs solve
    typedef vector<vector<char>> g;
    int dx[] = {0,0,-1,1},dy[] = {-1,1,0,0};
    class Solution {
    public:
        void solve(vector<vector<char>> &board) {
            int n = board.size();
            if(n<1) return;
            int m=board[0].size();
             
            for(int i=0;i<n;++i) {
                dfs(board,i,0,'*');
                dfs(board,i,m-1,'*');
            }
            for(int i=0;i<m;++i) {
                dfs(board,0,i,'*');
                dfs(board,n-1,i,'*');
            }
           
             
            for(int i=0;i<n;++i) {
                for(int j=0;j<m;++j) {
                    if(board[i][j]=='O') {
                        board[i][j] = 'X';
                    }else if(board[i][j]=='*') board[i][j] = 'O';
                }
            }
            
        }
            
        void solve(g& board,int a,int b,char p) {
            if(a<0||b<0||a>=board.size()||b>=board[0].size()||board[a][b]=='X') return;
            board[a][b] = p;
            for(int i=0;i<4;++i) {
                int x = a+dx[i],y = b+dy[i];
                if(x<0||y<0||x>=board.size()||y>=board[0].size()||board[x][y]=='X'||board[x][y]=='*') continue;
                solve(board,x,y,p);
            }
        }
        
        
        
    };
    
    

    最大连续序列的长度

    题目描述
    给定一个无序的整数类型数组,求最长的连续元素序列的长度。
    例如:
    给出的数组为[1000, 4, 2000, 1, 3, 2],
    最长的连续元素序列为[1, 2, 3, 4]. 返回这个序列的长度:4
    你需要给出时间复杂度在O(n)之内的算法
    示例1
    输入
    复制
    [1000, 4, 2000, 1, 3, 2]
    返回值
    复制
    4

    这个题可以看成是遍历一维的图

    
    
    class Solution {
    public:
        /**
         * 
         * @param num int整型vector 
         * @return int整型
         */
        int longestConsecutive(vector<int>& num) {
            if(num.size()<=1) return num.size();
            // write code here
            unordered_set<int>_map(num.begin(),num.end());
            
            int malen=1;
            for(int x: num) {
                int r=x,l=x;
                _map.erase(x);
                while(_map.count(l-1)) _map.erase(l-1),l--;
                while(_map.count(r+1)) _map.erase(r+1),r++;
                malen = max(malen,r-l+1);
            }
           
            return malen;
        }
    };
    
    
  • 相关阅读:
    【Java123】JDBC数据库连接池建立
    【招聘123】Some good open positions
    [Java123]Gradle
    4_3:流程控制:循环练习
    4_3:流程控制:while + do while + continue + break
    4_2:流程控制:[ for循环 ] + 断点调试
    4_1:流程控制:分支结构:[ if else ] + [ 三元表达式 ] + [ switch case ]
    3:运算符 + 运算符优先级 [ 逻辑短路 ]
    2_3:变量:[ 类型之间转换 ]
    2_2:变量:[ 五种简单数据类型 ]
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/14324779.html
Copyright © 2011-2022 走看看