leetcode周赛补完计划(二)

周赛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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值