Leetcode算法——1706、球会落何处
题目
思路
小模拟
最终的位置只需要考虑列坐标,右挡板会使小球列坐标+1,左挡板会使小球列坐标-1。列坐标为0代表小球现在位于第零列上,所列坐标小于0或超出最大范围说明小球被挡住。
小球终止即最后输出值为-1的情况有三种
- 碰到左边墙,列坐标小于零
- 碰到右边墙,列坐标大于列数-1
- 碰到v字形,当前的挡板方向,与小球滑下后的挡板方向不同
其他的情况小球都会继续下滑
关于代码中为啥使用for\else而不是if\else
for\else如果代码没有在for循环内break,则最后运行else语句,因为我们需要计算最后小球落下的位置,所以需要小球能够落到最低部,即不会被break掉。
第二,将else移到里面if下对于能够落到最低部的小球来说逻辑没有任何问题,但对于落不到底部的小球,则会让小球位置记录为先前能够下到最后一个位置的列坐标,结果就不是-1了,如果使用if\else的话需要将代码改为
if col < 0 or col > n - 1 or row[col] != dir:
ans[j] = -1
break
else:
ans[j] = col
Python3解法(for\else)
def findBall(self, grid: List[List[int]]) -> List[int]:
n = len(grid[0])
result = [-1] * n
for j in range(n):
position = j
for row in grid:
dir = row[position]
position += dir
# 若碰到左边墙,右边墙,v字形
if position < 0 or position > n - 1 or row[position] != dir:
break
else:
result[j] = position
return result
Python3解法(if\else)
def findBall(self, grid: List[List[int]]) -> List[int]:
n = len(grid[0])
result = [-1] * n
for j in range(n):
position = j
for row in grid:
dir = row[position]
position += dir
# 若碰到左边墙,右边墙,v字形
if col < 0 or col > n - 1 or row[col] != dir:
ans[j] = -1
break
else:
ans[j] = col
return result