题目描述
现在有一个仅包含‘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;
}
};