• 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
  • 相关阅读:
    S7-1200PLC与昆仑通态触摸屏通讯
    Unity3D XML与Properties配置文件读取详解
    MATLAB 条件语句
    【shell】linux通过complete命令完成使用tab键自动补全
    交换机笔记二
    C#/VB.NET 将XML转为PDF
    五、RocketMQ发送顺序消息
    项目接入腾讯云短信服务SMS实现向用户发送手机验证码
    【特征重要性揭秘:为什么同一个数据集会有不同结果】
    好用的VsCode 插件备忘录
  • 原文地址:https://blog.csdn.net/wangjun861205/article/details/126174396