【Leetcode】1706. Where Will the Ball Fall

题目地址:

https://leetcode.com/problems/where-will-the-ball-fall/

考虑一个 m × n m\times n m×n的二维矩阵 g g g,只含 − 1 -1 1 1 1 1,每个格子看成一个挡板, − 1 -1 1代表的是形如/的挡板, 1 1 1代表的是形如\的挡板。从第 0 0 0行上方的一共 n n n个空位处,每个地方放一个小球,让其自由下落。其或者会卡在边界,或者被卡在中途。要求返回一个数组 A A A A [ i ] A[i] A[i]表示下标为 i i i的小球最终掉在了哪一列,如果卡在中间了则赋值为 − 1 -1 1。如果下图, A [ 0 ] = 1 A[0]=1 A[0]=1,因为 0 0 0号球掉在了 1 1 1号列,别的球都卡住了,从而 A [ i > 0 ] = − 1 A[i>0]=-1 A[i>0]=1
在这里插入图片描述
思路是DFS。枚举每个球,然后模拟掉落的过程。分类讨论每次能向下掉的条件。如果当前在 g [ i ] [ j ] g[i][j] g[i][j],分两种情况,如果 g [ i ] [ j ] = 1 g[i][j]=1 g[i][j]=1,那么就说明球有向右走的倾向,则需要右边不是墙,并且 g [ i ] [ j + 1 ] = 1 g[i][j+1]=1 g[i][j+1]=1,这样就能走到 ( i + 1 , j + 1 ) (i+1,j+1) (i+1,j+1)这个位置;如果 g [ i ] [ j ] = − 1 g[i][j]=-1 g[i][j]=1,那么就说明球有向左走的倾向,则需要左边不是墙,并且 g [ i ] [ j − 1 ] = − 1 g[i][j-1]=-1 g[i][j1]=1,这样就能走到 ( i + 1 , j − 1 ) (i+1,j-1) (i+1,j1)这个位置。走出下边界的时候, y y y坐标的值即为该球掉的地方。代码如下:

public class Solution {
    public int[] findBall(int[][] grid) {
        int[] res = new int[grid[0].length];
        for (int i = 0; i < grid[0].length; i++) {
            res[i] = dfs(0, i, grid);
        }
        
        return res;
    }
    
    private int dfs(int x, int y, int[][] g) {
        if (x == g.length) {
            return y;
        }
        
        if (g[x][y] == 1) {
            if (y == g[0].length - 1 || g[x][y + 1] == -1) {
                return -1;
            } else {
                return dfs(x + 1, y + 1, g);
            }
        } else {
            if (y == 0 || g[x][y - 1] == 1) {
                return -1;
            } else {
                return dfs(x + 1, y - 1, g);
            }
        }
    }
}

时间复杂度 O ( m n ) O(mn) O(mn),空间 O ( m ) O(m) O(m)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值