17 lines
5.9 KiB
HTML
17 lines
5.9 KiB
HTML
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="X-UA-Compatible" content="IE=edge"><title> leetcode-01-matrix · MarkDown</title><meta name="description" content="leetcode-01-matrix - Ching"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="short icon" href="/favicon.png"><link rel="stylesheet" href="/css/apollo.css"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600" type="text/css"><meta name="generator" content="Hexo 6.0.0"><link rel="alternate" href="/atom.xml" title="MarkDown" type="application/atom+xml">
|
||
</head><body><header><a href="/" class="logo-link"><img src="/logo.png"></a><ul class="nav nav-list"><li class="nav-list-item"><a href="/" target="_self" class="nav-list-link">ALL</a></li><li class="nav-list-item"><a href="/categories/leetcode/" target="_self" class="nav-list-link">LEETCODE</a></li><li class="nav-list-item"><a href="/atom.xml" target="_self" class="nav-list-link">RSS</a></li></ul></header><section class="container"><div class="post"><article class="post-block"><h1 class="post-title">leetcode-01-matrix</h1><div class="post-meta"><div class="post-time">2020年4月16日</div></div><div class="post-content"><h3 id="542-01-矩阵"><a href="#542-01-矩阵" class="headerlink" title="542. 01 矩阵"></a>542. 01 矩阵</h3><p><a target="_blank" rel="noopener" href="https://leetcode-cn.com/problems/01-matrix/">题目</a></p>
|
||
<span id="more"></span>
|
||
|
||
|
||
|
||
<p>想了两种思路</p>
|
||
<ol>
|
||
<li><p>0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">updateMatrix</span>(<span class="params">self, matrix: <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]]</span>) -> <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]]:</span></span><br><span class="line"> m, n = <span class="built_in">len</span>(matrix), <span class="built_in">len</span>(matrix[<span class="number">0</span>])</span><br><span class="line"> dist = [[<span class="number">0</span>] * n <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(m)]</span><br><span class="line"> zeroes_pos = [(i, j) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(m) <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(n) <span class="keyword">if</span> matrix[i][j] == <span class="number">0</span>]</span><br><span class="line"> <span class="comment"># 将所有的 0 添加进初始队列中</span></span><br><span class="line"> q = collections.deque(zeroes_pos)</span><br><span class="line"> seen = <span class="built_in">set</span>(zeroes_pos)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 广度优先搜索</span></span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> i, j = q.popleft()</span><br><span class="line"> <span class="keyword">for</span> ni, nj <span class="keyword">in</span> [(i - <span class="number">1</span>, j), (i + <span class="number">1</span>, j), (i, j - <span class="number">1</span>), (i, j + <span class="number">1</span>)]:</span><br><span class="line"> <span class="keyword">if</span> <span class="number">0</span> <= ni < m <span class="keyword">and</span> <span class="number">0</span> <= nj < n <span class="keyword">and</span> (ni, nj) <span class="keyword">not</span> <span class="keyword">in</span> seen:</span><br><span class="line"> dist[ni][nj] = dist[i][j] + <span class="number">1</span></span><br><span class="line"> q.append((ni, nj))</span><br><span class="line"> seen.add((ni, nj))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> dist</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
</li>
|
||
<li><p>从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。</p>
|
||
</li>
|
||
</ol>
|
||
</div></article></div></section><footer><div class="paginator"><a href="/2020/04/16/leetcode-merge-intervals/" class="prev">PRVE</a><a href="/2020/04/14/leetcode-add-two-numbers-ii/" class="next">NEXT</a></div><div class="copyright"><p>© 2016 - 2022 <a href="http://blog.tunpok.com">Ching</a>, unless otherwise noted.</p></div></footer><script src="https://cdn.bootcss.com/mathjax/2.5.3/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script></body></html> |