<?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 Ta0X1 の Blog</title><link>https://blog.taoxi.ink/tags/%E7%AE%97%E6%B3%95/</link><description>Recent content in 算法 on Ta0X1 の Blog</description><generator>Hugo</generator><language>zh-CN</language><copyright>2025-2026 Ta0X1 の Blog</copyright><lastBuildDate>Mon, 22 Sep 2025 05:19:49 +0800</lastBuildDate><atom:link href="https://blog.taoxi.ink/tags/%E7%AE%97%E6%B3%95/index.xml" rel="self" type="application/rss+xml"/><item><title>Leetcode twoSum函数详解</title><link>https://blog.taoxi.ink/p/20241116/</link><pubDate>Sat, 16 Nov 2024 16:00:00 +0800</pubDate><guid>https://blog.taoxi.ink/p/20241116/</guid><description>&lt;h1 id="对twosum函数代码的详细讲解"&gt;《对&amp;quot;twoSum&amp;quot;函数代码的详细讲解》&lt;/h1&gt;
&lt;p&gt;以下将针对这份代码进行详细讲解，旨在帮助零基础的初学者理解其功能及实现逻辑。&lt;/p&gt;
&lt;h2 id="一整体代码结构概述"&gt;一、整体代码结构概述&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Solution&lt;/span&gt;(object):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;twoSum&lt;/span&gt;(self, nums, target):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; length &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(nums)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(length):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; j &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(length):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; nums[i] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; nums[j] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; target &lt;span style="color:#f92672"&gt;and&lt;/span&gt; i&lt;span style="color:#f92672"&gt;!=&lt;/span&gt; j:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [i, j]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这段代码定义了一个名为 Solution 的类，其中包含了一个名为 twoSum 的方法。该方法的主要目的是在给定的数字列表 nums 中，找到两个不同的数，使得它们相加的和等于给定的目标值 target，并返回这两个数在列表中的索引。&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="对twosum函数代码的详细讲解">《对&quot;twoSum&quot;函数代码的详细讲解》</h1>
<p>以下将针对这份代码进行详细讲解，旨在帮助零基础的初学者理解其功能及实现逻辑。</p>
<h2 id="一整体代码结构概述">一、整体代码结构概述</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Solution</span>(object):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">twoSum</span>(self, nums, target):
</span></span><span style="display:flex;"><span>        length <span style="color:#f92672">=</span> len(nums)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(length):
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(length):
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> nums[i] <span style="color:#f92672">+</span> nums[j] <span style="color:#f92672">==</span> target <span style="color:#f92672">and</span> i<span style="color:#f92672">!=</span> j:
</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">return</span> [i, j]
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> []
</span></span></code></pre></div><p>这段代码定义了一个名为 Solution 的类，其中包含了一个名为 twoSum 的方法。该方法的主要目的是在给定的数字列表 nums 中，找到两个不同的数，使得它们相加的和等于给定的目标值 target，并返回这两个数在列表中的索引。</p>
<h2 id="二twosum-方法内部详细讲解">二、twoSum 方法内部详细讲解</h2>
<h3 id="一获取列表长度">（一）获取列表长度</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>length <span style="color:#f92672">=</span> len(nums)
</span></span></code></pre></div><p>这行代码使用了Python内置的 len 函数来获取输入的数字列表 nums 的长度。</p>
<p>len 函数是一个非常常用的函数，它的作用是返回给定可迭代对象（如列表、字符串、元组等）中元素的数量。</p>
<p>在这里，通过 len(nums) 计算出列表 nums 的长度，并将结果赋值给变量 length。</p>
<p>例如，如果 nums = [2, 7, 11, 15]，那么 length 的值就会是 4。这个长度值在后续的循环遍历列表元素时会起到重要作用。</p>
<h3 id="二嵌套循环遍历列表">（二）嵌套循环遍历列表</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(length):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(length):
</span></span></code></pre></div><p>这里使用了两层嵌套的 for 循环来遍历数字列表 nums。</p>
<ul>
<li><strong>外层循环</strong>：for i in range(length) 这行代码开启了外层循环。</li>
</ul>
<p>range(length) 会生成一个从 0 到 length - 1 的整数序列，在每次循环时，变量 i 会依次被赋予这个序列中的每个值。</p>
<p>例如，当 length = 4 时，i 会依次取值为 0、1、2、3。</p>
<p>外层循环的作用是逐个遍历列表 nums 中的元素，每次循环时，当前被遍历到的元素索引由 i 表示。</p>
<ul>
<li><strong>内层循环</strong>：for j in range(length) 开启了内层循环。</li>
</ul>
<p>同样，它也会生成一个从 0 到 length - 1 的整数序列，每次循环时，变量 j 会依次被赋予这个序列中的每个值。</p>
<p>内层循环的目的是对于外层循环当前遍历到的每个元素（由 i 索引表示），再次遍历列表中的所有元素（由 j 索引表示），以便全面搜索满足特定条件的元素组合。</p>
<h3 id="三寻找满足条件的两个数">（三）寻找满足条件的两个数</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">if</span> nums[i] <span style="color:#f92672">+</span> nums[j] <span style="color:#f92672">==</span> target <span style="color:#f92672">and</span> i<span style="color:#f92672">!=</span> j:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> [i, j]
</span></span></code></pre></div><p>这是整个代码的核心逻辑部分。在两层循环遍历列表的过程中，对于每一对由 i 和 j 索引所指向的元素（即 nums[i] 和 nums[j]），会进行如下条件判断：</p>
<ul>
<li>nums[i] + nums[j] == target：检查当前由 i 和 j 索引指向的两个元素相加是否等于给定的目标值 target。</li>
</ul>
<p>例如，如果 nums = [2, 7, 11, 15]，target = 9，当 i = 0（此时 nums[i] = 2），j = 1（此时 nums[j] = 7）时，nums[i] + nums[j] = 2 + 7 = 9，满足这个条件。</p>
<ul>
<li>i!= j：确保找到的是两个不同的元素，即它们在列表中的索引不同。这是因为如果允许同一个元素被使用两次，可能会得到不符合预期的结果。</li>
</ul>
<p>当这两个条件同时满足时，就说明找到了满足要求的两个数，此时会执行 return [i, j]，将这两个数在列表 nums 中的索引以列表形式返回。例如，在上述例子中，就会返回 [0, 1]，因为 2 的索引是 0，7 的索引是 1。</p>
<h3 id="四未找到满足条件的情况">（四）未找到满足条件的情况</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">return</span> []
</span></span></code></pre></div><p>如果两层嵌套循环全部执行完毕，都没有找到满足 nums[i] + nums[j] == target 且 i!= j 条件的两个数，那么就会执行这行代码，返回一个空列表 []。这表示在给定的数字列表 nums 中，按照当前设定的条件，未能找到合适的两个数相加等于目标值 target。</p>
]]></content:encoded></item><item><title>数独代码详解</title><link>https://blog.taoxi.ink/p/20230322/</link><pubDate>Wed, 22 Mar 2023 16:00:00 +0800</pubDate><guid>https://blog.taoxi.ink/p/20230322/</guid><description>详细讲解Python实现数独求解器的递归算法，包括矩阵转换、空白格查找、数值筛选和递归试错等核心技术</description><content:encoded><![CDATA[<p>😀 当时赶工期，一连五天晚上没有好好睡觉，没有实现GUI可视化，有点可惜。</p>
<h1 id="sudoku-python作品">Sudoku-Python作品</h1>
<h1 id="1-前言微叙">1 前言微叙</h1>
<p>本附属文档及Python作品，演示视频作者：张宁</p>
<p>就读学校：泌阳县第一高级中学</p>
<p>本作品灵感来源：Leetcode</p>
<p>关于此程序：本程序杂糅了作者在见到本题目开始至本程序截稿期间，个人想法，本校科技社成员间的交流，以及部分博文所体现出来的试错递归思想，数独矩阵技巧，下标数学问题。在经过多次测试后实现了本程序基础算法的完整性，可行性，快捷性，由于本程序主要集中于集合，算法，递归，函数学习。所以对于可视化，观赏性，本作品没有足够的精力来优化，但本程序体现了数学思想和Python的不可分割，以及数学思维，编程思维之间的相辅相成，希望评委能够给予支持，感谢。</p>
<h1 id="2-程序简介">2 程序简介</h1>
<h2 id="21-数独简介">2.1 数独简介</h2>
<p>数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字，推理出所有剩余空格的数字，并满足每一行、每一列、每一个粗线宫（3*3）内的数字均含1-9，不重复。</p>
<p>注：本段来源于百度百科</p>
<h1 id="3-实现思路">3 实现思路</h1>
<h2 id="31-转换矩阵">3.1 转换矩阵</h2>
<h3 id="311-代码实现">3.1.1 代码实现</h3>
<p>123456789101112131415161718192021m = [[6, 0, 0, 1, 0, 0, 7, 0, 8],[0, 0, 0, 8, 0, 0, 2, 0, 0],[2, 3, 8, 0, 5, 0, 1, 0, 0],[0, 0, 0, 0, 4, 0, 0, 9, 2],[0, 0, 4, 3, 0, 8, 6, 0, 0],[3, 7, 0, 0, 1, 0, 0, 0, 0],[0, 0, 3, 0, 7, 0, 5, 2, 6],[0, 0, 2, 0, 0, 4, 0, 0, 0],[9, 0, 7, 0, 0, 6, 0, 0, 4]]</p>
<p>本段代码无任何技术难题，不再赘述。</p>
<h2 id="32-探寻首格">3.2 探寻首格</h2>
<h3 id="321-码前思路">3.2.1 码前思路</h3>
<p>借助于本文档【1.1】中对数独的解释，可以得出解数独的第一步是寻找第一个空白格。对于人类而言，在短时间内的大量试错是极其浪费时间的，但对于具有极强计算能力的计算机来说，试错是比人类技巧更简单的一种方法</p>
<h3 id="322-代码实现">3.2.2 代码实现</h3>
<p>1234567891011def start_0(m:&ldquo;矩阵&rdquo;):#寻找第一个0for x in range(9):for y in range(9):if m[x][y] == 0:return x, yreturn -1,-1</p>
<p>在本程序的前部分，已经将数独转化为Python矩阵，并且将未填入的数字用0来代替。在本段代码中，通过使用两个for循环来确定0格的位置。倘若无0点，则证明本数独已然完成。</p>
<h2 id="33-探寻下格">3.3 探寻下格</h2>
<h3 id="331-码前思路">3.3.1 码前思路</h3>
<p>如果将当前格填入之后，下一步的工作便是填入下一个空白格，但是在码前应当思考，下一格的坐标如何确定，如果单纯的以x+1便会致使程序只在第一行进行(若第一个空格在第一行的条件下)，所以这里要考虑空格的换行问题。</p>
<h3 id="332-代码实现">3.3.2 代码实现</h3>
<p>1234567891011121314151617def seenext(m:&ldquo;矩阵&rdquo;, x:&ldquo;行&rdquo;, y:&ldquo;列&rdquo;):for next_y in range(y+1, 9):if m[x][next_y] == 0:return x, next_yfor next_x in range(x+1, 9):for next_y in range(0, 9):if m[next_x][next_y] == 0:return next_x, next_yreturn -1, -1</p>
<p>本段代码在探寻下一行时使用了两个for 循环，第一个循环计算了在本行的条件下，通过用累加y值进行判断是否为0。第二个计算了下一列中的空格。其余不再赘述。</p>
<h2 id="34-剔除筛选重要">3.4 剔除筛选[重要]</h2>
<h3 id="341-码前思路">3.4.1 码前思路</h3>
<p>将 1~9 这个数字集合中，与行的数字集合、列的数字集合以及九宫格的数字集合重叠的部分去除。剩余的就是符合条件的集合。</p>
<h3 id="342-代码实现">3.4.2 代码实现</h3>
<p>123456789def value(m:&ldquo;矩阵&rdquo;, x:&ldquo;行&rdquo;, y:&ldquo;列&rdquo;):i, j = x//3, y//3g = [m[i<em>3+r][j</em>3+c] for r in range(3) for c in range(3)]v = set([x for x in range(1,10)]) - set(g) - set(m[x]) - set(list(zip(*m))[y])return list(v)</p>
<p>line2中的整除是为了得出在哪一宫，line3中的[i3+r][j3+c]是根据I,j(m[i3][j3]是本宫的起始位点)。并将横纵坐标用for循环累加。</p>
<p>Line4利用set，zip来确定具体的集合。</p>
<h2 id="35-递归试错">3.5 递归试错</h2>
<h3 id="351-码前思路">3.5.1 码前思路</h3>
<p>以首空格为基本，尝试下一个空格，若下一个空格的集合为空，则解数独失败，将此格填为0，再次试错。</p>
<h3 id="352-代码实现">3.5.2 代码实现</h3>
<p>123456789101112131415161718192021def trysudoku(m:&ldquo;矩阵&rdquo;, x:&ldquo;行&rdquo;, y:&ldquo;列&rdquo;):for v in value(m, x, y):m[x][y] = vnext_x, next_y = seenext(m, x, y)if next_y == -1: #无return Trueelse:end = trysudoku(m, next_x, next_y) #递归if end == True:return Truem[x][y] = 0</p>
<p>在本段代码中，通过对上一步获得的集合进行填数，从value中填入数字，倘若无空格，则返回True,如果在seenext中未探寻到空格，那么便会得到next_y=-1,故无下一个空白格。如果有下一个空白格，则进行下一个空白格的试错，直至end=True。本数独完成。</p>
<h2 id="36-代码整合">3.6 代码整合</h2>
<h3 id="361-代码实现">3.6.1 代码实现</h3>
<p>1234567def sudoku(m):x, y = start_0(m)trysudoku(m, x, y)print(m)</p>
<p>由于本段代码无任何技术性难题，不进行【码前思路】部分。</p>
<h1 id="4-视频演示">4 视频演示</h1>
<p>1074_0b2eryahtmimzmaeuoaxkrsd5dqepf2azmsa.f0.mp4</p>
]]></content:encoded></item></channel></rss>