1706. Where Will the Ball Fall (DP, IQ)

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.

First,  there are two types of cases that would not reach the bottom. 

1. no matter what row it is, if the column index is 0 and grid[i][0] is -1.

2. if the column index is m - 1and grid[i][m - 1] is 1.

We would do a brute force, and use the ball to loop over its path. Here we would spend O(n*m).

The K represent the ball's position. i represent the rows.

class Solution {
public:
    vector<int> findBall(vector<vector<int>>& grid) {
        int n = grid.size();
        int m = grid[0].size();
        vector<int> ans(m, 0);
        // we need to tell which ball goes to which col 
        // use k to mem the balls status 
        for(int i = 0; i < m; i++){
            int k = i;
            for(int j = 0; j < n;j++){
                if(k != m - 1 && grid[j][k] == 1 && grid[j][k + 1] == 1){
                    k++;
                    
                }
                else if(k != 0 && grid[j][k] == -1 && grid[j][k - 1] == -1){
                    k--;
                    
                }
                else{
                    ans[i] = -1;
                    break;
                }
                if(j == n - 1)ans[i] = k;
            }
        }
        return ans;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值