• LeetCode每日一题(1706. Where Will the Ball Fall)


    You have a 2-D grid of size m x n representing a box, and you have n balls. The box is open on the top and bottom sides.

    Each cell in the box has a diagonal board spanning two corners of the cell that can redirect a ball to the right or to the left.

    A board that redirects the ball to the right spans the top-left corner to the bottom-right corner and is represented in the grid as 1.
    A board that redirects the ball to the left spans the top-right corner to the bottom-left corner and is represented in the grid as -1.
    We drop one ball at the top of each column of the box. Each ball can get stuck in the box or fall out of the bottom. A ball gets stuck if it hits a “V” shaped pattern between two boards or if a board redirects the ball into either wall of the box.

    Return an array answer of size n where answer[i] is the column that the ball falls out of at the bottom after dropping the ball from the ith column at the top, or -1 if the ball gets stuck in the box.

    Example 1:

    Input: grid = [[1,1,1,-1,-1],[1,1,1,-1,-1],[-1,-1,-1,1,1],[1,1,1,1,-1],[-1,-1,-1,-1,-1]]
    Output: [1,-1,-1,-1,-1]

    Explanation: This example is shown in the photo.
    Ball b0 is dropped at column 0 and falls out of the box at column 1.
    Ball b1 is dropped at column 1 and will get stuck in the box between column 2 and 3 and row 1.
    Ball b2 is dropped at column 2 and will get stuck on the box between column 2 and 3 and row 0.
    Ball b3 is dropped at column 3 and will get stuck on the box between column 2 and 3 and row 0.
    Ball b4 is dropped at column 4 and will get stuck on the box between column 2 and 3 and row 1.

    Example 2:

    Input: grid = [[-1]]
    Output: [-1]

    Explanation: The ball gets stuck against the left wall.

    Example 3:

    Input: grid = [[1,1,1,1,1,1],[-1,-1,-1,-1,-1,-1],[1,1,1,1,1,1],[-1,-1,-1,-1,-1,-1]]
    Output: [0,1,2,3,4,-1]

    Constraints:

    • m == grid.length
    • n == grid[i].length
    • 1 <= m, n <= 100
    • grid[i][j] is 1 or -1.

    别想复杂了, 这题就没什么难度。假设 grid[r][c] == 1(右下), 只要 grid[r][c+1]1 就可以进入下一行, 如果 grid[r][c] == -1(左下), 只要 grid[r][c-1]-1 就可以进入下一行。 最后一行的规则跟这一样, 只不过不会进入下一行而是直接掉出。注意考虑两边是墙的情况。


    impl Solution {
        fn check(grid: &Vec<Vec<i32>>, row: usize, col: usize) -> i32 {
            let curr = grid[row][col];
            if row == grid.len() - 1 {
                if curr == 1 {
                    if col == grid[0].len() - 1 {
                        return -1;
                    }
                    let right = grid[row][col + 1];
                    if right == -1 {
                        return -1;
                    }
                    return col as i32 + 1;
                }
                if col == 0 {
                    return -1;
                }
                let left = grid[row][col - 1];
                if left == 1 {
                    return -1;
                }
                return col as i32 - 1;
            }
            if curr == -1 {
                if col == 0 {
                    return -1;
                }
                let left = grid[row][col - 1];
                if left == 1 {
                    return -1;
                }
                return Solution::check(grid, row + 1, col - 1);
            }
            if col == grid[0].len() - 1 {
                return -1;
            }
            let right = grid[row][col + 1];
            if right == -1 {
                return -1;
            }
            return Solution::check(grid, row + 1, col + 1);
        }
        pub fn find_ball(grid: Vec<Vec<i32>>) -> Vec<i32> {
            let mut ans = vec![-1; grid[0].len()];
            for i in 0..ans.len() {
                let idx = Solution::check(&grid, 0, i);
                if idx >= 0 {
                    ans[i] = idx;
                }
            }
            ans
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
  • 相关阅读:
    CodeLite 16.0可以编译通过,但是在编辑器界面会显示找不到标准库头文件
    2.02_python+Django+mysql实现pdf转word项目_项目开发- 项目配置(settings.py配置)
    【Eye-tracking】DIDEC: The Dutch Image Description and Eye-tracking Corpus
    网络练习题带答案
    弹性数据库连接池探活策略调研(二)——Druid
    简化的 Java 六边形架构
    《机器人SLAM导航核心技术与实战》第1季:第3章_OpenCV图像处理
    基于SSM的外卖点餐系统设计与实现
    图文看懂JavaScritpt引擎V8与JS执行过程
    如何搭建一个 websocket
  • 原文地址:https://blog.csdn.net/wangjun861205/article/details/126174396