查看: 2853| 回复: 13
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Python/Perl] 求解释一行python code

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
leetcode 第200题

solution code来自 https://www.jiuzhang.com/solutio ... ghlight-lang-python python 的第60行
     在网站是公开的,付不付费都能看,不存在侵犯版权的问题
  1. from collections import deque

  2. class Solution:
  3.     def numIslands(self, grid: List[List[str]]) -> int:
  4.         
  5.         if not grid or not grid[0]:
  6.             return 0
  7.         
  8.         island = 0
  9.         for i in range(len(grid)):
  10.             for j in range(len(grid[0])):
  11.                 if grid[i][j] == "1":
  12.                     self.bfs(grid,i,j)
  13.                     island += 1
  14.         return island
  15.             
  16.     def bfs(self, grid, x, y):
  17.         
  18.         queue = deque([(x,y)]) #这里如果写成 deque([x,y]), 就会出现  int is not iterable,导致两种不同的结果的原因是什么呢?
  19.         grid[x][y] = "0"
  20.         
  21.         while queue:
  22.             x, y = queue.popleft()

  23.             for delta_x, delta_y in ([1,0],[-1,0],[0,1],[0,-1]):
  24.                 next_x = x + delta_x
  25.                 next_y = y + delta_y
  26.                 if not self.is_valid(grid,next_x,next_y):
  27.                     continue
  28.                     
  29.                 grid[next_x][next_y] = "0"
  30.                 queue.append((next_x,next_y))
  31.                
  32.                
  33.     def is_valid(self,grid,x,y):
  34.         m = len(grid)
  35.         n = len(grid[0])
  36.         return 0 <= x < m and 0 <= y <n and grid[x][y] == "1"
复制代码



我的问题是 queue = deque([(x,y)]) #这里如果写成 deque([x,y]), 就会出现  int is not iterable,导致两种不同的结果的原因是什么呢?

上一篇:后续之[绝望+无奈,CS master 究竟该继续找工作还是回国]
下一篇:感觉Rust刷题不错诶
全局:
ShikiH 发表于 2019/05/28 08:58:41
算是对楼上的一点补充:
这里用deque而不是用list是因为list pop(0)是o(n),但是deque popleft()只要o(1)
详见:https://wiki.python.org...

对,所以不用pop,而是用for loop iterate下一个元素(队首元素),时间是O(1),直接用list就可以了
回复

使用道具 举报

推荐
idealmaster 2019-5-28 07:47:40 | 只看该作者
全局:
抱歉,上面第六行写错了,不能直接更新x, y
  1. def bfs(self, grid, x, y):
  2.     q = [(x, y)]
  3.     grid[x][y] = "0"
  4.     for x, y in q:
  5.         for dx, dy in ((1,0),(-1,0),(0,1),(0,-1)):
  6.                 nx, ny = x+dx, y+dy
  7.                 if self.is_valid(grid, nx, ny):
  8.                         grid[nx][ny] = "0"
  9.                         q.append((nx, ny))
  10.     return 1
复制代码


顺便如果你让你的bfs返回一个1的话,上面island的计算也可以用list comprehension来算出来了
  1. def numIslands(self, grid):
  2.     m, n = len(grid), len(grid) and len(grid[0])
  3.     return sum(self.bfs(grid, i, j) for i in range(m) for j in range(n) if grid[i][j] == "1")
复制代码







回复

使用道具 举报

推荐
idealmaster 2019-5-28 07:17:39 | 只看该作者
全局:
Python里的FIFO queue操作可以直接用一个for list,因为Python list是动态的,本身是可以不断被更新
就比如这个例子,就可以写成:
  1. def bfs(self, grid, x, y):
  2.     q = [(x, y)]
  3.     grid[x][y] = "0"
  4.     for x, y in q:
  5.         for dx, dy in ((1,0),(-1,0),(0,1),(0,-1)):
  6.                 x, y = x+dx, y+dy
  7.                 if self.is_valid(grid, x, y):
  8.                         grid[x][y] = "0"
  9.                         q.append((x, y))
复制代码

当然,queue里面元素应该是一个(x, y),而不是x或者y,所以初始化是要[(x, y)]
回复

使用道具 举报

全局:
令狐冲老师的Python第60行吗?是空行啊。。
回复

使用道具 举报

全局:
看了下 九章的题解渲染有问题 标的行数和实际行数不对应 楼主发一下究竟要问哪一行
回复

使用道具 举报

🔗
 楼主| 林红玉 2019-5-28 00:32:19 | 只看该作者
全局:
一剑终情 发表于 2019-5-27 23:16
看了下 九章的题解渲染有问题 标的行数和实际行数不对应 楼主发一下究竟要问哪一行

谢谢! 在我发的code的第19行,代码上也有注明问题

补充内容 (2019-5-28 00:33):
在原网站是被comment 了, 因为原网站给的是lintcode的题解,leetcode版本在comment里
回复

使用道具 举报

全局:

大概就是这样的
那个报错不是出在deque([x, y])的时候,是出在x, y = queue.popleft()的时候
因为你这里写了x, y = queue.popleft(),所以会要求这个deque里面的元素一定要是能分解成x, y的。你要是用deque([x, y])的化,那么这个deque是有两个int元素,你popleft出来只是一个int,没办法分解成两个int
回复

使用道具 举报

🔗
 楼主| 林红玉 2019-5-28 02:06:25 | 只看该作者
全局:
yao zou 发表于 2019-5-28 01:05
大概就是这样的
那个报错不是出在deque([x, y])的时候,是出在x, y = queue.popleft()的时候
因为你这 ...

有道理,所以while queue并没有循环queue对吗?只要queue不为空就可以?
回复

使用道具 举报

全局:
林红玉 发表于 2019-5-28 02:06
有道理,所以while queue并没有循环queue对吗?只要queue不为空就可以?

Python里面while (xxxx)这个语句的意思就是,如果xxxx是boolean的化,判断xxxx是不是True。否则将xxxx转换到boolean判断是不是True
如果xxxx是一个空容器的化,它转换到boolean就是False
回复

使用道具 举报

🔗
 楼主| 林红玉 2019-5-28 02:20:04 | 只看该作者
全局:
yao zou 发表于 2019-5-28 02:14
Python里面while (xxxx)这个语句的意思就是,如果xxxx是boolean的化,判断xxxx是不是True。否则将xxxx转 ...

懂了~开心得原地转圈圈感谢~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表