当前位置:   article > 正文

Leetcode算法——1706、球会落何处_leetcode 1706

leetcode 1706

题目

题目链接

思路

小模拟
最终的位置只需要考虑列坐标,右挡板会使小球列坐标+1,左挡板会使小球列坐标-1。列坐标为0代表小球现在位于第零列上,所列坐标小于0或超出最大范围说明小球被挡住。
小球终止即最后输出值为-1的情况有三种

  1. 碰到左边墙,列坐标小于零
  2. 碰到右边墙,列坐标大于列数-1
  3. 碰到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
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/136659
推荐阅读
相关标签
  

闽ICP备14008679号