每日一题~leetcode

该博客介绍了LeetCode第1706题的解题思路和解决方案。题目涉及一个带有挡板的网格,挡板会将球导向左侧或右侧。球从顶部开始滑动,直到找到无法再滑动的位置。博客详细解释了如何确定球最后落在哪一列,并给出了相应的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1706. 球会落何处

题目大意

  • 每个单元格都有一个对角线挡板,可以将球导向左侧或者右侧
  • 将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示
  • 将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示
  • 返回一个大小为 n 的数组 answer ,其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1

解题思路

  1. 球向下滑动的位置(i , j)
将球导向右侧的挡板右下方 (i+1 , j+1)
将球导向左侧的挡板左下方 (i+1 , j+1)
  1. 球是能下滑
可以向右下滑grid (i, j) == grid (i , j + 1)
可以向左下滑grid (i, j) == grid (i , j - 1)
解释向右下滑必须满足当前位置和它右侧位置的挡板同向,同理,向左下滑必须满足当前位置和它左侧的挡板方向一致
  1. 球不能下滑
球不能下滑两个挡板或者挡板与樯形成 v 字形

代码

int* findBall(int** grid, int gridSize, int* gridColSize, int* returnSize){
    int *ans = (int*)malloc(sizeof(int)*gridColSize[0]);   //定义一个长度为n的数组
    int col = 0;
    for(int i = 0; i < gridColSize[0]; i++){     //遍历每一个可以放球的位置
        col = i;            // 球的初始位置
        for(int j = 0; j < gridSize; j++){       //模拟球滑行轨迹
            int dir = grid[j][col];        //当前板的方向      
            col += dir;             //col表示将要滑向的方向,球将要滑向的下一个位置{ 假设球可以向下滑,如果是向右的挡板,则下一个滑行位置一定是当前位置的右下方,同理,如果是向左的挡板,则下一个滑行位置一定是当前位置的左下方 }
            if(col < 0 || col == gridColSize[0] || grid[j][col] != dir){   //col < 0  到达左挡板,与左挡板形成v字形
                col = -1;                                                  //col == gridColSize[0] 到达右挡板,与右挡板形成v字形
                break;                                                     //grid[j][col] != dir 成 V 字形(将要滑向
            }                           //         的位置的上方的挡板不是和当前位置的挡板不是同一个方向,即形成 V 字形)
        }
        ans[i] = col;
    }
    *returnSize = gridColSize[0];
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放逐、青春*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值