<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>矩阵 on On My Way</title>
    <link>https://tuanzi-wow.cn/tags/%E7%9F%A9%E9%98%B5/</link>
    <description>Recent content in 矩阵 on On My Way</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 06 Sep 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://tuanzi-wow.cn/tags/%E7%9F%A9%E9%98%B5/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>HOT100 · 矩阵</title>
      <link>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-matrix/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-matrix/</guid>
      <description>HOT100 矩阵专题：矩阵置零、螺旋矩阵、旋转图像与搜索二维矩阵。</description>
      <content:encoded><![CDATA[<h3 id="1矩阵置零">1.矩阵置零</h3>
<h4 id="题目描述">题目描述</h4>
<p>给定一个 <code>*m* x *n*</code> 的矩阵，如果一个元素为 <strong>0</strong> ，则将其所在行和列的所有元素都设为 <strong>0</strong> 。请使用 <strong><a href="http://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95">原地</a></strong> 算法**。**</p>
<p><strong>示例 1：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/08/17/mat1.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[1,1,1],[1,0,1],[1,1,1]]
</span></span><span class="line"><span class="cl">输出：[[1,0,1],[0,0,0],[1,0,1]]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/08/17/mat2.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
</span></span><span class="line"><span class="cl">输出：[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="题解">题解：</h4>
<p>O(MN):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def setZeroes(self, matrix: List[List[int]]) -&gt; None:
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        Do not return anything, modify matrix in-place instead.
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        m = len(matrix)
</span></span><span class="line"><span class="cl">        n = len(matrix[0])
</span></span><span class="line"><span class="cl">        ans = []
</span></span><span class="line"><span class="cl">        for x in range(m):
</span></span><span class="line"><span class="cl">            for y in range(n):
</span></span><span class="line"><span class="cl">                if matrix[x][y] == 0:
</span></span><span class="line"><span class="cl">                    ans.append((x,y))
</span></span><span class="line"><span class="cl">        for ele in ans:
</span></span><span class="line"><span class="cl">            for y in range(n):
</span></span><span class="line"><span class="cl">                matrix[ele[0]][y] = 0
</span></span><span class="line"><span class="cl">            for x in range(m):
</span></span><span class="line"><span class="cl">                matrix[x][ele[1]] = 0
</span></span><span class="line"><span class="cl">             
</span></span></code></pre></td></tr></table>
</div>
</div><p>方法二：第一行和列作为标记位：挺简单的，自己看</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def setZeroes(self, matrix: List[List[int]]) -&gt; None:
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        Do not return anything, modify matrix in-place instead.
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        row = len(matrix)
</span></span><span class="line"><span class="cl">        col = len(matrix[0])
</span></span><span class="line"><span class="cl">        row0_flag = False
</span></span><span class="line"><span class="cl">        col0_flag = False
</span></span><span class="line"><span class="cl">        # 找第一行是否有0
</span></span><span class="line"><span class="cl">        for j in range(col):
</span></span><span class="line"><span class="cl">            if matrix[0][j] == 0:
</span></span><span class="line"><span class="cl">                row0_flag = True
</span></span><span class="line"><span class="cl">                break
</span></span><span class="line"><span class="cl">        # 第一列是否有0
</span></span><span class="line"><span class="cl">        for i in range(row):
</span></span><span class="line"><span class="cl">            if matrix[i][0] == 0:
</span></span><span class="line"><span class="cl">                col0_flag = True
</span></span><span class="line"><span class="cl">                break
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 把第一行或者第一列作为 标志位
</span></span><span class="line"><span class="cl">        for i in range(1, row):
</span></span><span class="line"><span class="cl">            for j in range(1, col):
</span></span><span class="line"><span class="cl">                if matrix[i][j] == 0:
</span></span><span class="line"><span class="cl">                    matrix[i][0] = matrix[0][j] = 0
</span></span><span class="line"><span class="cl">        #print(matrix)
</span></span><span class="line"><span class="cl">        # 置0
</span></span><span class="line"><span class="cl">        for i in range(1, row):
</span></span><span class="line"><span class="cl">            for j in range(1, col):
</span></span><span class="line"><span class="cl">                if matrix[i][0] == 0 or matrix[0][j] == 0:
</span></span><span class="line"><span class="cl">                    matrix[i][j] = 0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        if row0_flag:
</span></span><span class="line"><span class="cl">            for j in range(col):
</span></span><span class="line"><span class="cl">                matrix[0][j] = 0
</span></span><span class="line"><span class="cl">        if col0_flag:
</span></span><span class="line"><span class="cl">            for i in range(row):
</span></span><span class="line"><span class="cl">                matrix[i][0] = 0
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="2螺旋矩阵">2.螺旋矩阵</h3>
<h4 id="题目描述-1">题目描述</h4>
<p>给你一个 <code>m</code> 行 <code>n</code> 列的矩阵 <code>matrix</code> ，请按照 <strong>顺时针螺旋顺序</strong> ，返回矩阵中的所有元素。</p>
<p><strong>示例 1：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/11/13/spiral1.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
</span></span><span class="line"><span class="cl">输出：[1,2,3,6,9,8,7,4,5]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/11/13/spiral.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
</span></span><span class="line"><span class="cl">输出：[1,2,3,4,8,12,11,10,9,5,6,7]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>提示：</strong></p>
<ul>
<li><code>m == matrix.length</code></li>
<li><code>n == matrix[i].length</code></li>
<li><code>1 &lt;= m, n &lt;= 10</code></li>
<li><code>-100 &lt;= matrix[i][j] &lt;= 100</code></li>
</ul>
<h4 id="题解-1">题解：</h4>
<p>我说实话，这道题是目前见过最有意思的了
方向数组，取余转向，m,n = n,m-1这几个都挺有意思的</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">DIRS = (0, 1), (1, 0), (0, -1), (-1, 0)  # 右下左上
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def spiralOrder(self, matrix: List[List[int]]) -&gt; List[int]:
</span></span><span class="line"><span class="cl">        m, n = len(matrix), len(matrix[0])
</span></span><span class="line"><span class="cl">        size = m * n
</span></span><span class="line"><span class="cl">        ans = []
</span></span><span class="line"><span class="cl">        i, j, di = 0, -1, 0  # 从 (0, -1) 开始
</span></span><span class="line"><span class="cl">        while len(ans) &lt; size:
</span></span><span class="line"><span class="cl">            dx, dy = DIRS[di]
</span></span><span class="line"><span class="cl">            for _ in range(n):  # 走 n 步（注意 n 会减少）
</span></span><span class="line"><span class="cl">                i += dx
</span></span><span class="line"><span class="cl">                j += dy  # 先走一步
</span></span><span class="line"><span class="cl">                ans.append(matrix[i][j])  # 再加入答案
</span></span><span class="line"><span class="cl">            di = (di + 1) % 4  # 右转 90°
</span></span><span class="line"><span class="cl">            m, n = n, m - 1  # 减少后面的循环次数（步数）
</span></span><span class="line"><span class="cl">        return ans
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="3旋转图像">3.旋转图像</h3>
<p>题目描述：给定一个 <em>n</em> × <em>n</em> 的二维矩阵 <code>matrix</code> 表示一个图像。请你将图像顺时针旋转 90 度。</p>
<p>你必须在**<a href="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95"> 原地</a>** 旋转图像，这意味着你需要直接修改输入的二维矩阵。<strong>请不要</strong> 使用另一个矩阵来旋转图像。</p>
<p><strong>示例 1：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/08/28/mat1.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
</span></span><span class="line"><span class="cl">输出：[[7,4,1],[8,5,2],[9,6,3]]
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>示例 2：</strong></p>
<p><img alt="img" loading="lazy" src="https://assets.leetcode.com/uploads/2020/08/28/mat2.jpg"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">输入：matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
</span></span><span class="line"><span class="cl">输出：[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="题解-2">题解：</h4>
<p><strong>IM SO FUCKING SMART！！！！</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def rotate(self, matrix: List[List[int]]) -&gt; None:
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        Do not return anything, modify matrix in-place instead.
</span></span><span class="line"><span class="cl">        &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">        n  = len(matrix)
</span></span><span class="line"><span class="cl">        ans = [[0] * n for _ in range(n)]
</span></span><span class="line"><span class="cl">        for i in range(n):
</span></span><span class="line"><span class="cl">            for j in range(i+1,n):注意这个i+1啊，只交换一半，不然就交换回去了
</span></span><span class="line"><span class="cl">                matrix[i][j],matrix[j][i] = matrix[j][i],matrix[i][j]
</span></span><span class="line"><span class="cl">        for row in matrix:
</span></span><span class="line"><span class="cl">            row.reverse()
</span></span><span class="line"><span class="cl">       
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4搜索二维矩阵">4.搜索二维矩阵：</h3>
<h4 id="题目描述-2">题目描述：</h4>
<p>编写一个高效的算法来搜索 <code>*m* x *n*</code> 矩阵 <code>matrix</code> 中的一个目标值 <code>target</code> 。该矩阵具有以下特性：</p>
<ul>
<li>每行的元素从左到右升序排列。</li>
<li>每列的元素从上到下升序排列。</li>
</ul>
<h4 id="题解-3">题解</h4>
<p>直接暴力了啊</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def searchMatrix(self, matrix: List[List[int]], target: int) -&gt; bool:
</span></span><span class="line"><span class="cl">        m = len(matrix)
</span></span><span class="line"><span class="cl">        n = len(matrix[0])
</span></span><span class="line"><span class="cl">        for x in range(m):
</span></span><span class="line"><span class="cl">            for y in range(n):
</span></span><span class="line"><span class="cl">                if matrix[x][y] == target:
</span></span><span class="line"><span class="cl">                    return True
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return False
</span></span></code></pre></td></tr></table>
</div>
</div><p>或者改进逻辑：从右上角(左下角也可以）开始寻找，小的在左，大的在下，保持单一方向单一逻辑</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">searchMatrix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">matrix</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">]],</span> <span class="n">target</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">m</span><span class="p">,</span><span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">matrix</span><span class="p">),</span><span class="nb">len</span><span class="p">(</span><span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="n">row</span><span class="p">,</span><span class="n">col</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="n">row</span> <span class="o">&lt;</span> <span class="n">m</span> <span class="ow">and</span> <span class="n">col</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">col</span><span class="p">]</span> <span class="o">==</span> <span class="n">target</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">col</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">target</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">col</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">row</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl">        
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
  </channel>
</rss>
