周赛134
leetcode 1033. 移动石子直到连续
public int[] numMovesStones(int a, int b, int c) {
int max = 0,min = 0;
int[] res = {min,max};
int[] order = {a,b,c};
Arrays.sort(order);
if(order[1] - order[0] == 1 && order[2] - order[1] == 1)
return res; //石子连续
if(order[1] - order[0] <= 2 || order[2]-order[1] <= 2){
min = 1; //某一石子连续
}
else {
min = 2; //都不连续
}
max = order[2]-order[0]-2; //max = end - start - 2
res[0] = min;
res[1] = max;
return res;
}
leetcode 1034.边框着色
解题思路:题目不好理解,其实就是从(r0,c0)点出发遍历grid网格,满足以下两点条件,将该点的值更改为color
一、该点处于grid的边框
二、该点四面(上下左右)的值和它相同
public int[][] colorBorder(int[][] grid, int r0, int c0, int color) {
int rlen = grid.length;
int clen = grid[0].length;
int pre = grid[r0][c0];
boolean[][] tab = new boolean[rlen][clen];
dfs(grid,r0,c0,color,pre,tab);
return grid;
}
public boolean dfs(int[][] grid,int r,int c,int color,int pre,boolean[][] tab){
if(r >= 0 && r < grid.length && c >= 0 && c < grid[0].length && tab[r][c])
return true;
if(r < 0 || r >= grid.length || c < 0 || c >= grid[0].length || pre != grid[r][c])
return false;
tab[r][c] = true;
boolean up = dfs(grid, r - 1, c, color, pre, tab);
boolean left = dfs(grid, r, c - 1, color, pre, tab);
boolean down = dfs(grid, r + 1, c, color, pre, tab);
boolean right = dfs(grid, r, c + 1, color, pre, tab);
if(r == 0 || c == 0 || r == grid.length-1 || c == grid[0].length-1
|| !up || !left || !down || !right){
grid[r][c] = color;
}
return tab[r][c];
}
leetcode 1035. 不相交的线
解题思路:动态规划
public int maxUncrossedLines(int[] A, int[] B) {
int lenA = A.length;
int lenB = B.length;
int[][] dp = new int[lenA+1][lenB+1];
dp[0][0] = 0;
for(int i = 1;i <= lenA;i++){
for(int j = 1;j <= lenB;j++){
if(A[i - 1] == B[j - 1]){
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[lenA][lenB];
}