<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Python on 一共十七划</title>
		<link>https://noirzh.com/tags/python/</link>
		<description>Recent content in Python on 一共十七划</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Sat, 17 Feb 2024 16:11:25 +0800</lastBuildDate>
		
			<atom:link href="https://noirzh.com/tags/python/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>题解-通过操作使数组长度最小筑-脑筋急转弯,用小数踢掉大数</title>
				<link>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E9%80%9A%E8%BF%87%E6%93%8D%E4%BD%9C%E4%BD%BF%E6%95%B0%E7%BB%84%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F/</link>
				<pubDate>Sun, 21 Jan 2024 01:51:17 +0800</pubDate>
				<guid>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E9%80%9A%E8%BF%87%E6%93%8D%E4%BD%9C%E4%BD%BF%E6%95%B0%E7%BB%84%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/minimize-length-of-array-using-operations/description/&#34;&gt;100164. 通过操作使数组长度最小&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;!--TOC--&gt;&#xD;&#xA;&lt;h2 id=&#34;思路&#34;&gt;思路&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;观察$nums[i]%nums[j]$有如下的可能性&#xA;&lt;ul&gt;&#xA;&lt;li&gt;如果$nums[i]&amp;lt;nums[j]$,最后只是将数组中的$nums[j]$踢出&lt;/li&gt;&#xA;&lt;li&gt;$nums[i]&amp;gt;=nums[j]$则是二者踢出,$nums[i]%nums[j]$进入数组,且显然$nums[i]%nums[j]&amp;lt;nums[j]&amp;lt;=nums[i]$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;因为没有限定ij的关系,发现这种操作要么是小数将大数从数组中踢掉,要么是引入一个更小的数,将二者踢掉&lt;/li&gt;&#xA;&lt;li&gt;最后剩下的长度应该和数组中最小值有关,且这个最小值包括操作中可能产生的&lt;/li&gt;&#xA;&lt;li&gt;如果没有产生新的最小值,则很容易知道最后剩下的数就是原始数组中最小值的数量,然后将其两两组合,引进0,就能得到答案&lt;/li&gt;&#xA;&lt;li&gt;如何产生更小值:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;回顾1,我们将所有数与最小值相模&lt;/li&gt;&#xA;&lt;li&gt;如果余数不为0,就为新的最小值&lt;/li&gt;&#xA;&lt;li&gt;如果余数全为0,说明所有数都是最小值的倍数,则它们之间两两相模的最小值大于等于原始数组的最小值&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;我们只需要产生一个新的更小值就能把所有其他数都踢掉,此时答案是1&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;时间复杂度:$O(n)$&lt;/p&gt;&#xA;&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;minimumArrayLength&lt;/span&gt;(self, nums: List[int]) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        m&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;min(nums)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; nums:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; num&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;m&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#75715e&#34;&gt;# 可以产生新的最小值&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        length&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count(m)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; length&lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;length&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>题解-需要添加的硬币的最小数量-最大化在缺口处补硬币的作用</title>
				<link>https://noirzh.com/%E9%A2%98%E8%A7%A3-%E9%9C%80%E8%A6%81%E6%B7%BB%E5%8A%A0%E7%9A%84%E7%A1%AC%E5%B8%81%E7%9A%84%E6%9C%80%E5%B0%8F%E6%95%B0%E9%87%8F-%E6%9C%80%E5%A4%A7%E5%8C%96%E5%9C%A8%E7%BC%BA%E5%8F%A3%E5%A4%84%E8%A1%A5/</link>
				<pubDate>Sun, 03 Dec 2023 12:05:00 +0800</pubDate>
				<guid>https://noirzh.com/%E9%A2%98%E8%A7%A3-%E9%9C%80%E8%A6%81%E6%B7%BB%E5%8A%A0%E7%9A%84%E7%A1%AC%E5%B8%81%E7%9A%84%E6%9C%80%E5%B0%8F%E6%95%B0%E9%87%8F-%E6%9C%80%E5%A4%A7%E5%8C%96%E5%9C%A8%E7%BC%BA%E5%8F%A3%E5%A4%84%E8%A1%A5/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/minimum-number-of-coins-to-be-added/description/&#34;&gt;100153. 需要添加的硬币的最小数量&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;思路&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;这题和&lt;a href=&#34;https://leetcode.cn/problems/maximum-number-of-consecutive-values-you-can-make/description/&#34;&gt;LeetCode-1798. 你能构造出连续值的最大数目&lt;/a&gt;很像,很经典的想法&lt;/li&gt;&#xD;&#xA;&lt;li&gt;是子序列所以先排序&lt;/li&gt;&#xD;&#xA;&lt;li&gt;先考虑我们手里的硬币能构造出来多少&lt;/li&gt;&#xD;&#xA;&lt;li&gt;假设我们手里的硬币足够我们构造出来[0,x),接下来我们又拿到了一个硬币,数值为y,&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;如果我们把y放进之前的所有序列之中,会发现我们能够构造[y,x+y)&lt;/li&gt;&#xD;&#xA;&lt;li&gt;再加上刚才的区间,我们手里的硬币加y之后能构造的数的范围为$[0,x)\bigcup[y,x+y)$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;如果y&amp;lt;=x则我们能够构造的数就能达到[0,x+y)&lt;/li&gt;&#xD;&#xA;&lt;li&gt;如果y&amp;gt;x则会有一段空缺&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;为了填补这段空缺,我们应该往里面放另一块硬币,假设为z,根据上面的推论,我们很容易得到z会生成的片段为[z,x+z),而且z的取值范围应该为[y-x,x],为了让填补有效,且最大化填补的内容,应该让z=x,因为这样能最大化填补的空缺&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;取最大更有可能单次填补完空缺&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;而我们遇到的问题只是将y换成了target,所有遇到的大于当前x的也认为是y即可&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;Code&lt;/h2&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def minimumAddedCoins(self, coins: List[int], target: int) -&amp;gt; int:&#xD;&#xA;        coins.sort()&#xD;&#xA;        res=0&#xD;&#xA;        canMake=0 #能生成的范围是[0,canMake]&#xD;&#xA;        i=0&#xD;&#xA;        while i&amp;lt;(len(coins)):&#xD;&#xA;            val=coins[i]&#xD;&#xA;            if val&amp;lt;=canMake+1:&#xD;&#xA;                canMake+=val&#xD;&#xA;                i+=1&#xD;&#xA;            else:&#xD;&#xA;                res+=1 #这里补的硬币就是canMake+1&#xD;&#xA;                canMake+=canMake+1&#xD;&#xA;        while canMake&amp;lt;target:&#xD;&#xA;            res+=1&#xD;&#xA;            canMake+=canMake+1&#xD;&#xA;        return res&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&lt;audio controls=&#34;True&#34; preload=&#34;none&#34;&gt;&lt;source src=&#34;https://noirzh.com/wp-content/uploads/2023/12/03.光降るなあ.flac&#34; type=&#34;audio/flac&#34;/&gt;&lt;/audio&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>题解-求和游戏-数学,以及简单分类证明</title>
				<link>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E6%B1%82%E5%92%8C%E6%B8%B8%E6%88%8F-%E6%95%B0%E5%AD%A6%E4%BB%A5%E5%8F%8A%E7%AE%80%E5%8D%95%E5%88%86%E7%B1%BB%E8%AF%81%E6%98%8E/</link>
				<pubDate>Fri, 01 Dec 2023 20:15:11 +0800</pubDate>
				<guid>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E6%B1%82%E5%92%8C%E6%B8%B8%E6%88%8F-%E6%95%B0%E5%AD%A6%E4%BB%A5%E5%8F%8A%E7%AE%80%E5%8D%95%E5%88%86%E7%B1%BB%E8%AF%81%E6%98%8E/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/sum-game/description/&#34;&gt;1927. 求和游戏&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;!-- toc --&gt;&#xD;&#xA;&lt;h2 id=&#34;初始思路&#34;&gt;初始思路&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;考虑一些等价:我们先把这个数分为两个部分$left,right$,分别是左右两边数字的和,形式化写为$\displaystyle right=\sum_{i=n/2}^{n}num_i(0&amp;lt;=num_i&amp;lt;=9)$剩下的问号数量分别为$n_{left},n_{right}$&lt;/li&gt;&#xA;&lt;li&gt;我们要做的实际上是对$left和right$分别操作$n_{left},n_{right}$n次,其中我们允许的操作就是对该数加上0-9的任意一个数&lt;/li&gt;&#xA;&lt;li&gt;显然操作是对称的,所以我们只考虑有效的操作数,也就是$abs(n_{left}-n_{right})$,而且显然有效的操作数只会存在于一个数身上:如果出现在两个身上就会对称消除&lt;/li&gt;&#xA;&lt;li&gt;我们可以先除去一些情况:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;如果剩下的有效操作是奇数,则Alice一定赢,因为她一定不会选择让数相等的操作(只有一个选择),而Alice有10个合法选择&lt;/li&gt;&#xA;&lt;li&gt;然后我们发现操作一定会让数增加,也就是说,如果存在有效操作的是较大的那个数,则一定不可能相等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;现在我们只剩下了一种情况:有一个较小的数能够让双方都操作$x$次,如何让较小的数变为较大的数&lt;/li&gt;&#xA;&lt;li&gt;设两数相差的绝对值为$gap$,每个人能操作$x$次&lt;/li&gt;&#xA;&lt;li&gt;Alice有两个选择:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一个是积极加,在自己的回合里都加9,这样会让较小的数飞快增长,如果两数相差比较小,就能让这个数超过大点的数,从而Bob不能选出来:也就是$9x&amp;gt;gap$,Alice能赢&lt;/li&gt;&#xA;&lt;li&gt;另一个是完全消极,每次都加0,这样会让数缓慢增长,单靠Bob变数增加,如果$gap&amp;gt;9x$,此时Alice也赢&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;我们惊讶地发现此时出现了9x大于小于gap,Bob都会输,就只剩下了$$9x==gap$$,所幸,我们能发现此时Bob会赢,因为不管此时Alice如何操作,Bob后手都能补齐9&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sumGame&lt;/span&gt;(self, num: str) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; bool:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(num)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        nums&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        right&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n&lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; num[i]&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;?&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                nums&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                left&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;ord(num[i])&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ord(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n&lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,n):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; num[i]&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;?&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                nums&lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                right&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;ord(num[i])&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ord(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; (left&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;right &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; (left&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;right &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;#最后轮到Alice或者一定不能赢的情况&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        AliceCan&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;abs(nums)&lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        want&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;abs(left&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;right)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; AliceCan&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;want:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>题解-找出叠涂元素-哈希表,两种思路,在途中检查和在最后检查</title>
				<link>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E6%89%BE%E5%87%BA%E5%8F%A0%E6%B6%82%E5%85%83%E7%B4%A0/</link>
				<pubDate>Fri, 01 Dec 2023 08:51:11 +0800</pubDate>
				<guid>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E6%89%BE%E5%87%BA%E5%8F%A0%E6%B6%82%E5%85%83%E7%B4%A0/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/first-completely-painted-row-or-column/description/&#34;&gt;2661. 找出叠涂元素&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;!-- toc --&gt;&#xD;&#xA;&lt;h1 id=&#34;思路中途检查&#34;&gt;思路:中途检查&lt;/h1&gt;&#xA;&lt;h2 id=&#34;解法&#34;&gt;解法&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据量不大,看着可以在每次涂色时候查询是否合法&lt;/li&gt;&#xA;&lt;li&gt;但是每次都查询显然会超时,我们选择一个更有效的优化&lt;/li&gt;&#xA;&lt;li&gt;已经说明各个数各不相同,不会出现一个格子被涂两遍的情况&lt;/li&gt;&#xA;&lt;li&gt;我们用数组来记录每一行和每一列已经被涂的格子数量,就能知道这一行列是否被全涂满&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;时间复杂度: $O(m*n)$&lt;/p&gt;&#xA;&lt;p&gt;空间复杂度: $O(m*n)$&lt;/p&gt;&#xA;&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;firstCompleteIndex&lt;/span&gt;(self, arr: List[int], mat: List[List[int]]) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        matMap&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{} &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        m&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(mat)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(mat[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        row&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;m&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        col&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(m):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; j &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                matMap[mat[i][j]]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(i,j) &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; index &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(len(arr)):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            num&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arr[index]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x,y&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;matMap[num]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            row[x]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            col[y]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; row[x]&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;n &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; col[y]&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;m:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; index&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;思路最后查询&#34;&gt;思路:最后查询&lt;/h1&gt;&#xA;&lt;h2 id=&#34;解法-1&#34;&gt;解法&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;我们注意到当我们知道某一行的所有元素的时候,变相知道了这一行会被什么时候涂满,既这一行存在arr中最靠后的那个索引&lt;/li&gt;&#xA;&lt;li&gt;所以我们的任务变成了寻找最先被涂满的行或者列&lt;/li&gt;&#xA;&lt;li&gt;对arr进行hash,记录每个元素的具体位置,再遍历行列,在遍历过程中&#xA;&lt;ul&gt;&#xA;&lt;li&gt;行列取最大值表示让这一行填满最少需要的步数&lt;/li&gt;&#xA;&lt;li&gt;res取上述的数的最小值&#xA;时间复杂度: $O(m&lt;em&gt;n)$&#xA;空间复杂度: $O(m&lt;/em&gt;n)$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;code-1&#34;&gt;Code&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; firstCompleteIndex(vector&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;amp;&lt;/span&gt; arr, vector&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;vector&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;amp;&lt;/span&gt; mat) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arr.size();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        unordered_map&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;,&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;hash;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;arr.size();i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hash[arr[i]]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;mat.size();i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; tmp&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; j&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;j&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;mat[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].size();j&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                tmp&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;max(tmp,hash[mat[i][j]]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;min(res,tmp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; j&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;j&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;mat[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].size();j&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; tmp&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;mat.size();i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                tmp&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;max(tmp,hash[mat[i][j]]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;min(res,tmp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;firstCompleteIndex&lt;/span&gt;(self, arr: List[int], mat: List[List[int]]) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(arr)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        m&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(mat)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(mat[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        arrLocation&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i,a &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(arr):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            arrLocation[a]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;i&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(m):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            nowColNeedSteps&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; j &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                nowColNeedSteps&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;max(nowColNeedSteps,arrLocation[mat[i][j]])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;min(res,nowColNeedSteps)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; j &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            nowRowNeedSteps&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(m):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                nowRowNeedSteps&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;max(nowRowNeedSteps,arrLocation[mat[i][j]])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;min(res,nowRowNeedSteps)           &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>题解-统计子串中的唯一字符-哈希表&#43;栈，计算贡献</title>
				<link>https://noirzh.com/%E9%A2%98%E8%A7%A3-%E7%BB%9F%E8%AE%A1%E5%AD%90%E4%B8%B2%E4%B8%AD%E7%9A%84%E5%94%AF%E4%B8%80%E5%AD%97%E7%AC%A6-%E5%93%88%E5%B8%8C%E8%A1%A8%E6%A0%88%EF%BC%8C%E8%AE%A1%E7%AE%97%E8%B4%A1%E7%8C%AE/</link>
				<pubDate>Sun, 26 Nov 2023 16:17:28 +0800</pubDate>
				<guid>https://noirzh.com/%E9%A2%98%E8%A7%A3-%E7%BB%9F%E8%AE%A1%E5%AD%90%E4%B8%B2%E4%B8%AD%E7%9A%84%E5%94%AF%E4%B8%80%E5%AD%97%E7%AC%A6-%E5%93%88%E5%B8%8C%E8%A1%A8%E6%A0%88%EF%BC%8C%E8%AE%A1%E7%AE%97%E8%B4%A1%E7%8C%AE/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/count-unique-characters-of-all-substrings-of-a-given-string/description/&#34;&gt;828. 统计子串中的唯一字符&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;思路&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;注意到一个唯一字符对数个子串生效，也就是在多个子串中唯一字符是固定的那几个，很容易想到贡献法&lt;/li&gt;&#xD;&#xA;&lt;li&gt;对于子串起点和终点我们设置成$left,right$,任意字符位置为$a_i$序列,让子串生效的范围是$left-right$这个范围内,存在一个字符a,其序列满足&lt;br/&gt;$$a_{i-1}&amp;lt;left&amp;lt;=a_i&amp;lt;=right&amp;lt;a_{i+1}$$,&lt;/li&gt;&#xD;&#xA;&lt;li&gt;同样可以通过枚举起点终点,得知满足这个条件子串的个数为 $(a_i-a_{i-1})*(a_{i+1}-a_{i})$,&lt;/li&gt;&#xD;&#xA;&lt;li&gt;为了计算方便我们将-1和n作为每个字符的两端,既$a_{-1}=-1,a_{n+1}=n$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;该字母在$a_i$上为答案做的贡献就等于子串的数量&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;解题方法&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;使用哈希表存储每个字母的位置序列&lt;/li&gt;&#xD;&#xA;&lt;li&gt;为了前后方便我们使用栈来维护具体的字母序列&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;时间复杂度,O(n)&lt;br/&gt;空间复杂度,O(n)&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;Code&lt;/h2&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def uniqueLetterString(self, s: str) -&amp;gt; int:&#xD;&#xA;        n=len(s) &#xD;&#xA;        hash=[[n] for _ in range(26)] #最右端点&#xD;&#xA;        for i in range(len(s)-1,-1,-1):&#xD;&#xA;            hash[ord(s[i])-ord(&#39;A&#39;)].append(i)&#xD;&#xA;            #小的在顶部,大的在底部&#xD;&#xA;        res=0&#xD;&#xA;        for i in range(26):&#xD;&#xA;            pre=-1&#xD;&#xA;            while len(hash[i])&amp;gt;1:&#xD;&#xA;                index=hash[i].pop()&#xD;&#xA;                back=hash[i][-1]&#xD;&#xA;                res+=(index-pre)*(back-index)&#xD;&#xA;                pre=index&#xD;&#xA;        return res&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>题解-找到 Alice 和 Bob 可以相遇的建筑-单调栈&#43;二分&#43;离线</title>
				<link>https://noirzh.com/%E9%A2%98%E8%A7%A3-%E6%89%BE%E5%88%B0-alice-%E5%92%8C-bob-%E5%8F%AF%E4%BB%A5%E7%9B%B8%E9%81%87%E7%9A%84%E5%BB%BA%E7%AD%91-%E5%8D%95%E8%B0%83%E6%A0%88%E4%BA%8C%E5%88%86%E7%A6%BB%E7%BA%BF/</link>
				<pubDate>Sun, 19 Nov 2023 14:19:00 +0800</pubDate>
				<guid>https://noirzh.com/%E9%A2%98%E8%A7%A3-%E6%89%BE%E5%88%B0-alice-%E5%92%8C-bob-%E5%8F%AF%E4%BB%A5%E7%9B%B8%E9%81%87%E7%9A%84%E5%BB%BA%E7%AD%91-%E5%8D%95%E8%B0%83%E6%A0%88%E4%BA%8C%E5%88%86%E7%A6%BB%E7%BA%BF/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/find-building-where-alice-and-bob-can-meet/description/&#34;&gt;100110. 找到 Alice 和 Bob 可以相遇的建筑&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;思路&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;分解一下题目,发现和Alice和Bob二人顺序没关系,为了方便,我们假设Alice所在建筑位置在左边,称为a,bob就会在右边,称为b&lt;/li&gt;&#xD;&#xA;&lt;li&gt;假设a,b相等,则所在的位置就是b&lt;/li&gt;&#xD;&#xA;&lt;li&gt;若b所在高度大于a,则答案是b&lt;/li&gt;&#xD;&#xA;&lt;li&gt;剩下的就是我们要考虑的一般情况:b的高度小于a,&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;解题方法&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;我们要做的明确,查b的右侧大于a的第一个建筑&lt;/li&gt;&#xD;&#xA;&lt;li&gt;每次都向后查询显然时间复杂度不够,遍历q又是必须的,所以我们想把这个查询压到log级别&lt;/li&gt;&#xD;&#xA;&lt;li&gt;显然可以通过维护右侧单调栈+二分的模式&lt;/li&gt;&#xD;&#xA;&lt;li&gt;但是为每一个点都配单调栈内存不够&lt;/li&gt;&#xD;&#xA;&lt;li&gt;我们发现左边的单调栈一定是右边的转过来的&lt;/li&gt;&#xD;&#xA;&lt;li&gt;所以我们只需要维护一个单调栈&lt;/li&gt;&#xD;&#xA;&lt;li&gt;在遇到对于要处理的点的查询的时候直接查询就行&lt;/li&gt;&#xD;&#xA;&lt;li&gt;也就是我们总体过程是离线查询+单调栈+二分&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;代码细节&lt;/h2&gt;&#xD;&#xA;&lt;ol&gt;&#xD;&#xA;&lt;li&gt;我们先用哈希表记录查询,保证不漏:&lt;/li&gt;&#xD;&#xA;&lt;li&gt;先保证a&amp;lt;=b&lt;/li&gt;&#xD;&#xA;&lt;li&gt;以b为key,存储想查询的值:a和答案位置i&lt;/li&gt;&#xD;&#xA;&lt;li&gt;需要注意的是可能存在多个a的情况,需要用列表而不是一一对应&lt;/li&gt;&#xD;&#xA;&lt;li&gt;从后向前遍历,维护单调栈&lt;/li&gt;&#xD;&#xA;&lt;li&gt;对于遍历的点,如果在哈希表内,说明其是b&lt;/li&gt;&#xD;&#xA;&lt;li&gt;现在维护的单调栈满足需求&lt;/li&gt;&#xD;&#xA;&lt;li&gt;二分查到的答案再写回相应的位置&lt;/li&gt;&#xD;&#xA;&lt;/ol&gt;&#xD;&#xA;&lt;h2&gt;Code&lt;/h2&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:    &#xD;&#xA;    def leftmostBuildingQueries(self, heights: List[int], queries: List[List[int]]) -&amp;gt; List[int]:&#xD;&#xA;        n=len(queries)  &#xD;&#xA;        hash={}#记录b对应的a和index&#xD;&#xA;        for i in range(n):&#xD;&#xA;            a=min(queries[i])&#xD;&#xA;            b=max(queries[i])&#xD;&#xA;            if b not in hash:&#xD;&#xA;                hash[b]=[]&#xD;&#xA;            hash[b].append([a,i])&#xD;&#xA;&lt;pre&gt;&lt;code&gt;    #记录右边单调递增&#xD;&#xA;    st=[]&#xD;&#xA;    res=[-1]*n&#xD;&#xA;    for i in range(len(heights)-1,-1,-1):&#xD;&#xA;        h=heights[i]&#xD;&#xA;        while st and h&amp;amp;gt;heights[st[-1]]:&#xD;&#xA;            st.pop()&#xD;&#xA;        st.append(i)&#xD;&#xA;        if i in hash:&#xD;&#xA;            b=i&#xD;&#xA;            for a,index in hash[i]:&#xD;&#xA;                if heights[b]&amp;amp;gt;heights[a] or a==b:&#xD;&#xA;                    res[index]=b&#xD;&#xA;                else:&#xD;&#xA;                    l,r=0,len(st)-1&#xD;&#xA;                    while l&amp;amp;lt;=r:&#xD;&#xA;                        mid=(l+r)//2&#xD;&#xA;                        if heights[st[mid]]&amp;amp;gt;heights[a]:&#xD;&#xA;                            l=mid+1&#xD;&#xA;                        else:&#xD;&#xA;                            r=mid-1&#xD;&#xA;                    if (l-1&amp;amp;lt;0):&#xD;&#xA;                        res[index]=-1&#xD;&#xA;                    else:&#xD;&#xA;                        res[index]=st[l-1]&#xD;&#xA;    return res&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>题解-逃离火灾-两次BFS-在路上不会被烧到,处理边界</title>
				<link>https://noirzh.com/solution-escape-the-spreading-fire/</link>
				<pubDate>Thu, 09 Nov 2023 09:23:43 +0800</pubDate>
				<guid>https://noirzh.com/solution-escape-the-spreading-fire/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;Problem: [2258. 逃离火灾](https://leetcode.cn/problems/escape-the-spreading-fire/description/)&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;p&gt;&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;思路&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;– 由题意可知需要计算一条最短路,耗时最短以保证后续火传过来的时候让火传递的时间足够长来接近答案&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 火的蔓延时间用DFS求解,可以求出来火到各个节点的最少用时&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 应该考虑每次刷新一下出发时间来看此次最短路是否被烧掉吗?其实不用&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    – 只需要考虑在终点人能否比火早到即可&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    – 假如人在路上遇到火,则火到终点的用时一定小于等于人&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 保证了到终点的时候火耗时大于人可以反推出&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    1. 人和火相遇的路都能保证有如此长的等待时间&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    2. 若人和火不相遇则显然&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;细节&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;1. 如果起点起火不可达&lt;/p&gt;&#xD;&#xA;&lt;p&gt;2. 对于只有人可达的情况,是等待多久都可以的情况&lt;/p&gt;&#xD;&#xA;&lt;p&gt;3. 重点:因为允许人和火同时进安全屋,但是不能要求其他格子里人和火同时到&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    1. 考虑将终点旁边的两格当做终点,如果他们到达终点所剩下的时间大于等于1,显然可以在外面等一分钟&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;解题方法&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;– 两遍BFS求火和人到各个节点的距离&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 对于起点和终点的几种情况特判&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 查询以终点左边和上边的点是否允许多等一分钟&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 返回答案&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def maximumMinutes(self, grid: List[List[int]]) -&amp;gt; int:&#xD;&#xA;        n=len(grid[0])&#xD;&#xA;        m=len(grid)&#xD;&#xA;        times=[[0x7fffffff]*n for _ in range(m)]&#xD;&#xA;        q=deque()&#xD;&#xA;        directions=[[0,-1],[0,1],[1,0],[-1,0]]&#xD;&#xA;        for i in range(m):&#xD;&#xA;            for j in range(n):&#xD;&#xA;                if grid[i][j]==1:&#xD;&#xA;                    q.append([i,j])&#xD;&#xA;                elif grid[i][j]==2:&#xD;&#xA;                    times[i][j]=-1#不可达&#xD;&#xA;        now=0&#xD;&#xA;        h=set()  &#xD;&#xA;        while q:&#xD;&#xA;            length=len(q)&#xD;&#xA;            for _ in range(length):&#xD;&#xA;                i,j=q.popleft()&#xD;&#xA;                times[i][j]=now&#xD;&#xA;                h.add((i,j))&#xD;&#xA;                for dx,dy in directions:&#xD;&#xA;                    x,y=i+dx,j+dy&#xD;&#xA;                    if 0&amp;lt;=x&amp;lt;m and 0&amp;lt;=y&amp;lt;n and grid[x][y]!=2 and (x,y) not in h:&#xD;&#xA;                        q.append((x,y)) &#xD;&#xA;            now+=1&#xD;&#xA;        #然后我们求人到各个节点用时&#xD;&#xA;        people=[[0x7fffffff]*n for _ in range(m)]&#xD;&#xA;        q.append((0,0))&#xD;&#xA;        h.clear()&#xD;&#xA;        now=0&#xD;&#xA;        h=set()  &#xD;&#xA;        while q:&#xD;&#xA;            length=len(q)&#xD;&#xA;            for _ in range(length):&#xD;&#xA;                i,j=q.popleft()&#xD;&#xA;                people[i][j]=now&#xD;&#xA;                h.add((i,j))&#xD;&#xA;                for dx,dy in directions:&#xD;&#xA;                    x,y=i+dx,j+dy&#xD;&#xA;                    if 0&amp;lt;=x&amp;lt;m and 0&amp;lt;=y&amp;lt;n and grid[x][y]!=2 and grid[x][y]!=1 and (x,y) not in h:&#xD;&#xA;                        q.append((x,y)) &#xD;&#xA;            now+=1&#xD;&#xA;        if times[-1][-1]&amp;lt;people[-1][-1] or people[-1][-1]==0x7fffffff:&#xD;&#xA;            return -1 &#xD;&#xA;        if times[0][0]==0:&#xD;&#xA;            return -1&#xD;&#xA;        if times[-1][-1]==0x7fffffff:&#xD;&#xA;            return 1000000000#火不可达,说明人到火这一路都没有火&#xD;&#xA;        maxNeed=times[-1][-1]-people[-1][-1]&#xD;&#xA;        if times[-1][-2]&amp;gt;people[-1][-2]+maxNeed or times[-2][-1]&amp;gt;people[-2][-1]+maxNeed:&#xD;&#xA;            return maxNeed&#xD;&#xA;        return maxNeed-1&#xD;&#xA;&lt;p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>题解-每棵子树内缺失的最小基因值</title>
				<link>https://noirzh.com/minimum-time-to-eat-all-grains-solution/</link>
				<pubDate>Tue, 07 Nov 2023 15:33:00 +0800</pubDate>
				<guid>https://noirzh.com/minimum-time-to-eat-all-grains-solution/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;&lt;a href=&#34;https://leetcode.cn/problems/smallest-missing-genetic-value-in-each-subtree/&#34;&gt;每棵子树内缺失的最小基因值&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;题目简介&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;有一棵根节点为 0 的家族树 ，总共包含 n 个节点，节点编号为 0 到 n – 1 。给你一个下标从 0 开始的整数数组 parents ，其中 parents[i] 是节点 i 的父节点。由于节点 0 是 根 ，所以 parents[0] == -1 。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;总共有 $10^5$ 个基因值，每个基因值都用 闭区间 $[1, 10^5]$ 中的一个整数表示。给你一个下标从 0 开始的整数数组 nums ，其中 nums[i] 是节点 i 的基因值，且基因值互不相同 。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;请你返回一个数组 ans ，长度为 n ，其中 ans[i] 是以节点 i 为根的子树内 缺失 的 最小 基因值。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;节点 x 为根的 子树 包含节点 x 和它所有的后代节点。&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;思路&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;在概念上与41. 缺失的第一个正数题类似,都是找数,由于本题没有要求O(1)O(1)O(1)的空间复杂度,所以用哈希表是可能的&lt;/li&gt;&#xD;&#xA;&lt;li&gt;与数组中缺失的第一个正数类似的是,如果一棵树的节点不包括1,则以该树的任意节点为根的的子树都缺少1,这是最简单的情况&lt;/li&gt;&#xD;&#xA;&lt;li&gt;对于子节点有1的才是重要讨论的情况&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;解题方法&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;注意到需要处理的只是根节点到基因值为1的这一段的每个节点  &#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;注意到此时讨论的只是一条链&lt;/li&gt;&#xD;&#xA;&lt;li&gt;其他的节点的缺失值一定为1&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;可以用哈希表记录以该节点为根的子树包含的所有基因值,然后再每个节点都遍历一下&lt;/li&gt;&#xD;&#xA;&lt;li&gt;上述复杂度很高,再仔细观察节点的哈希表的形式,可以知道父节点的哈希表是所有子节点的合集加上自己的基因数&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;所以我们只需要自底向上遍历,维护一个哈希表就可以了&lt;/li&gt;&#xD;&#xA;&lt;li&gt;注意到父节点缺失的值不可能比子树缺失的还小,所以也需要维护一个基因数&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;时间复杂度:$O(n)$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;空间复杂度:$O(n)$&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;代码&lt;/h2&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def smallestMissingValueSubtree(self, parents: List[int], nums: List[int]) -&amp;gt; List[int]:&#xD;&#xA;        n=len(parents)&#xD;&#xA;        res=[1]*n #默认最有可能缺1&#xD;&#xA;        if 1 not in nums:&#xD;&#xA;            return res&#xD;&#xA;        graph=[[]for _ in range(n)]&#xD;&#xA;        for i in range(1,n):&#xD;&#xA;            graph[parents[i]].append(i)&#xD;&#xA;&lt;pre&gt;&lt;code&gt;    visited=set()  &#xD;&#xA;    def dfs(index):&#xD;&#xA;        visited.add(nums[index])&#xD;&#xA;        for child in graph[index]:&#xD;&#xA;            if nums[child] not in visited:&#xD;&#xA;                dfs(child)&#xD;&#xA;&#xD;&#xA;    root=nums.index(1) #找分界点&#xD;&#xA;    now=2&#xD;&#xA;    while root&amp;amp;gt;=0: #自底向上递归查找&#xD;&#xA;        dfs(root)&#xD;&#xA;        while now in visited:&#xD;&#xA;            now+=1&#xD;&#xA;        res[root]=now&#xD;&#xA;        root=parents[root]&#xD;&#xA;    return res&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2&gt;其他&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;这个理论上不能用与41题类似的将数组本身化为哈希表的操作,不然代码的复杂性很高,而且也不好理解&lt;/p&gt;</description>
			</item>
			<item>
				<title>题解-做菜顺序-排序,贪心,前缀和,一点点证明</title>
				<link>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E5%81%9A%E8%8F%9C%E9%A1%BA%E5%BA%8F/</link>
				<pubDate>Sun, 22 Oct 2023 08:16:17 +0800</pubDate>
				<guid>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E5%81%9A%E8%8F%9C%E9%A1%BA%E5%BA%8F/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/reducing-dishes/description/&#34;&gt;1402. 做菜顺序&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;!-- toc --&gt;&#xD;&#xA;&lt;h1 id=&#34;思路&#34;&gt;思路&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注意到没有要求顺序,先排序&lt;/li&gt;&#xA;&lt;li&gt;朴素思想是将大的数越往后放越好,但对于负数,虽然也是越大越往后放越好,但其有可能增加答案,也有可能减少答案,需要一些证明&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;解题方法&#34;&gt;解题方法&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注意到对于负数的选取一定是连续而非跳跃的:假设存在$[a_{i-1},a_i,a_{i+1}].a_i&amp;lt;a_{i+1},$数组,三者均小于0,假如一定要取两个元素,(这种假定的含义是我需要后面的正数有足够的倍数,期望前面提供倍数的负数(代价)最小),选取元素$a_{i-1},a_{i+1}$代价大于选取$a_i,a_{i+1}$&lt;/li&gt;&#xA;&lt;li&gt;推广可知我们会选取所有的正数和部分负数,且负数在排序后的数组中是连续的,并且和正数部分相连&lt;/li&gt;&#xA;&lt;li&gt;实际上是求一个子数组的这个操作最大能多大,可以枚举每一次从哪选,结束一定是在最大的数结束&lt;/li&gt;&#xA;&lt;li&gt;然后简化:注意到相关操作实际上是对于之前结果再加上一次已经遍历的数,所以可以将其转化为一遍扫描的方式&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;时间复杂度, $O(nlogn)$&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;code&#34;&gt;Code&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;maxSatisfaction&lt;/span&gt;(self, satisfaction: List[int]) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        satisfaction&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sort(reverse&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;#方便操作&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pre&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        now&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; satisfaction:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pre&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;num&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            now&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;pre&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;max(now,res)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; now&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#之后一定小于0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>题解-最长相邻不相等子序列 II</title>
				<link>https://noirzh.com/solution-longest-unequal-adjacent-groups-subsequence-ii/</link>
				<pubDate>Sun, 15 Oct 2023 02:42:00 +0800</pubDate>
				<guid>https://noirzh.com/solution-longest-unequal-adjacent-groups-subsequence-ii/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;Problem:&lt;a href=&#34;https://leetcode.cn/problems/longest-unequal-adjacent-groups-subsequence-ii/description/&#34;&gt;最长相邻不相等子序列&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;题目&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;给你一个整数 &lt;code&gt;n&lt;/code&gt; 和一个下标从 &lt;strong&gt;0&lt;/strong&gt; 开始的字符串数组 &lt;code&gt;words&lt;/code&gt; ，和一个下标从 &lt;strong&gt;0&lt;/strong&gt; 开始的数组 &lt;code&gt;groups&lt;/code&gt; ，两个数组长度都是 &lt;code&gt;n&lt;/code&gt; 。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;两个长度相等字符串的 &lt;strong&gt;汉明距离&lt;/strong&gt; 定义为对应位置字符 &lt;strong&gt;不同&lt;/strong&gt; 的数目。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;你需要从下标 &lt;code&gt;[0, 1, ..., n - 1]&lt;/code&gt; 中选出一个 &lt;strong&gt;最长子序列&lt;/strong&gt; ，将这个子序列记作长度为 &lt;code&gt;k&lt;/code&gt; 的 &lt;code&gt;[i&lt;sub&gt;0&lt;/sub&gt;, i&lt;sub&gt;1&lt;/sub&gt;, ..., i&lt;sub&gt;k - 1&lt;/sub&gt;]&lt;/code&gt; ，它需要满足以下条件：&lt;/p&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;&lt;strong&gt;相邻&lt;/strong&gt; 下标对应的 &lt;code&gt;groups&lt;/code&gt; 值 &lt;strong&gt;不同&lt;/strong&gt;。即，对于所有满足 &lt;code&gt;0 &amp;lt; j + 1 &amp;lt; k&lt;/code&gt; 的 &lt;code&gt;j&lt;/code&gt; 都有 &lt;code&gt;groups[i&lt;sub&gt;j&lt;/sub&gt;] != groups[i&lt;sub&gt;j + 1&lt;/sub&gt;]&lt;/code&gt; 。&lt;/li&gt;&#xD;&#xA;&lt;li&gt;对于所有 &lt;code&gt;0 &amp;lt; j + 1 &amp;lt; k&lt;/code&gt; 的下标 &lt;code&gt;j&lt;/code&gt; ，都满足 &lt;code&gt;words[i&lt;sub&gt;j&lt;/sub&gt;]&lt;/code&gt; 和 &lt;code&gt;words[i&lt;sub&gt;j + 1&lt;/sub&gt;]&lt;/code&gt; 的长度 &lt;strong&gt;相等&lt;/strong&gt; ，且两个字符串之间的 &lt;strong&gt;汉明距离&lt;/strong&gt; 为 &lt;code&gt;1&lt;/code&gt; 。&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;p&gt;请你返回一个字符串数组，它是下标子序列 &lt;strong&gt;依次&lt;/strong&gt; 对应 &lt;code&gt;words&lt;/code&gt; 数组中的字符串连接形成的字符串数组。如果有多个答案，返回任意一个。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;&lt;strong&gt;子序列&lt;/strong&gt; 指的是从原数组中删掉一些（也可能一个也不删掉）元素，剩余元素不改变相对位置得到的新的数组。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;&lt;code&gt;words&lt;/code&gt; 中的字符串长度可能 &lt;strong&gt;不相等&lt;/strong&gt; 。&lt;/p&gt;</description>
			</item>
			<item>
				<title>题解-有向图访问计数,一个有向基环树的简单应用</title>
				<link>https://noirzh.com/count-visited-nodes-in-a-directed-graph-solutions/</link>
				<pubDate>Sat, 14 Oct 2023 08:27:00 +0800</pubDate>
				<guid>https://noirzh.com/count-visited-nodes-in-a-directed-graph-solutions/</guid>
				<description>&lt;p&gt;&amp;gt; Problem: &lt;a href=&#34;https://leetcode.cn/problems/count-visited-nodes-in-a-directed-graph/description/&#34;&gt;2876. 有向图访问计数&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;思路&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;– 注意到这个图一定有环,而且每个点的出度都为1&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 由题意可知从任意节点出发其都能访问到相关的环&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 答案只分为两个情况:&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    – 点在环上,此时能访问的点只有环上的点,不可能出环,答案为环的长度&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    – 点在环外,除了环本身之外,其能访问本节点到环的几个节点,答案为环的长度加上其到环的距离&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 注意到可能有多个环相互独立存在,但是不可能出现两个环连通,所以几个图之间互相并不干扰&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;解题方法&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;1. 由以上思路得到基本想法,遍历解决每一个单独的环即可&lt;/p&gt;&#xD;&#xA;&lt;p&gt;2. 选择一个没有访问的节点,开始访问,其一定能进入环&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    1. 记录初次访问访问点的深度&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    2. 判断是否已经入环的方法就是判断该节点是否已经访问过&lt;/p&gt;&#xD;&#xA;&lt;p&gt;3. 对于当前点已经访问过有两种情况:&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    1. 当前节点在之前的旧图上就访问过:此时根据访问深度加上之前已经得出点的答案来更新答案数组&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    2. 当前节点是在这个新图上访问两次:此时第二次访问深度减去节点访问深度就是环的长度,更新环上节点的答案,环外带上的节点根据访问深度加环的长度更新&lt;/p&gt;&#xD;&#xA;&lt;p&gt;4. 持续上述操作直到所有节点都访问过,因为我们每次都将单个有环图的所有节点处理,所以每个节点都已经处理&lt;/p&gt;&#xD;&#xA;&lt;p&gt;&amp;gt; 时间复杂度,$O(n)$&lt;/p&gt;&#xD;&#xA;&lt;p&gt;&amp;gt; 空间复杂度,$O(n)$&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;代码&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;,对于这种问题应该可以补一个快慢指针法,但是此处没有做&lt;/p&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def countVisitedNodes(self, edges: List[int]) -&amp;gt; List[int]:&#xD;&#xA;        n=len(edges)&#xD;&#xA;        res=[-1]*n&#xD;&#xA;        visited=set()&#xD;&#xA;        for i in range(n):&#xD;&#xA;            if i in visited:&#xD;&#xA;                continue&#xD;&#xA;            now=begin=i #记录begin就不用做反图,直接顺序遍历就能找到答案&#xD;&#xA;            tmp=dict()#记录此次遍历的时候访问的点&#xD;&#xA;            index=0&#xD;&#xA;            while now not in visited:&#xD;&#xA;                tmp[now]=index&#xD;&#xA;                visited.add(now)&#xD;&#xA;                index+=1&#xD;&#xA;                now=edges[now]&#xD;&#xA;            # 此时我们访问了的图有三种可能,一条带,一个环,一个有带的环&#xD;&#xA;            # 后两种可能都是如下解法&#xD;&#xA;            if now in tmp:&#xD;&#xA;                #此时tmp[now]长度为点到环的长度&#xD;&#xA;                belt=dict()&#xD;&#xA;                circle=set()&#xD;&#xA;                length=tmp[now]&#xD;&#xA;                now=begin&#xD;&#xA;                while length&amp;gt;0:&#xD;&#xA;                    belt[now]=length&#xD;&#xA;                    length-=1&#xD;&#xA;                    now=edges[now]&#xD;&#xA;                while now not in circle:&#xD;&#xA;                    circle.add(now)&#xD;&#xA;                    now=edges[now]&#xD;&#xA;                r=len(circle)#环的长度&#xD;&#xA;                for u in tmp:&#xD;&#xA;                    res[u]=r if u in circle else r+belt[u]&#xD;&#xA;            # 第一种可能是比较好处理的&#xD;&#xA;            else:&#xD;&#xA;                #说明连接到了之前的有向基环树上,直接与已经访问的点相加即可&#xD;&#xA;                length=index&#xD;&#xA;                baseLength=res[now]&#xD;&#xA;                now=begin&#xD;&#xA;                while length&amp;gt;0:&#xD;&#xA;                    res[now]=baseLength+length&#xD;&#xA;                    now=edges[now]&#xD;&#xA;                    length-=1&#xD;&#xA;&lt;pre&gt;&lt;code&gt;    return res&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>题解-哈希表,用输入流实现C&#43;&#43;的split函数</title>
				<link>https://noirzh.com/reward-top-k-students-solution/</link>
				<pubDate>Wed, 11 Oct 2023 06:07:00 +0800</pubDate>
				<guid>https://noirzh.com/reward-top-k-students-solution/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;题目:&lt;a href=&#34;https://leetcode.cn/problems/reward-top-k-students/description/&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;奖励最顶尖的 K 名学生&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;题目描述&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;给你两个字符串数组 positive_feedback 和 negative_feedback ，分别包含表示正面的和负面的词汇。不会 有单词同时是正面的和负面的。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;一开始，每位学生分数为 0 。每个正面的单词会给学生的分数 加 3 分，每个负面的词会给学生的分数 减  1 分。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;给你 n 个学生的评语，用一个下标从 0 开始的字符串数组 report 和一个下标从 0 开始的整数数组 student_id 表示，其中 student_id[i] 表示这名学生的 ID ，这名学生的评语是 report[i] 。每名学生的 ID 互不相同。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;给你一个整数 k ，请你返回按照得分 从高到低 最顶尖的 k 名学生。如果有多名学生分数相同，ID 越小排名越前。&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;思路&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;题目不难,只需要对比各个词出现次数就可以&lt;/li&gt;&#xD;&#xA;&lt;li&gt;对于不同语言来说上面的可能有一定难度&lt;/li&gt;&#xD;&#xA;&lt;li&gt;所以写了一版C++的split(是用输入流实现的)&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;代码&lt;/h2&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-cpp&#34;&gt;class Solution {&#xD;&#xA;public:&#xD;&#xA;  vector&amp;lt;int&amp;gt; topStudents(vector&amp;lt;string&amp;gt;&amp;amp; positive_feedback, vector&amp;lt;string&amp;gt;&amp;amp; negative_feedback, vector&amp;lt;string&amp;gt;&amp;amp; report, vector&amp;lt;int&amp;gt;&amp;amp; student_id, int k) {&#xD;&#xA;      unordered_map&amp;lt;string,int&amp;gt;score;&#xD;&#xA;      vector&amp;lt;pair&amp;lt;int,int&amp;gt;&amp;gt;list;//直接嵌套vector的时间效率不如pair&#xD;&#xA;      for (auto word:positive_feedback) score[word]=3;&#xD;&#xA;      for (auto word:negative_feedback) score[word]=-1;&#xD;&#xA;      for (int i=0;i&amp;lt;student_id.size();i++){&#xD;&#xA;          string words=report[i];&#xD;&#xA;          int id=student_id[i];&#xD;&#xA;          int s=0;&#xD;&#xA;          string key;&#xD;&#xA;          istringstream is(words);//将字符转成输入流然后操作&#xD;&#xA;          while(getline(is,key,&#39; &#39;)){&#xD;&#xA;              if (score.count(key))&#xD;&#xA;                  //key不存在时int默认为0,但是那样效率不&#xD;&#xA;                  s+=score[key];如判断高&#xD;&#xA;          }&#xD;&#xA;          list.emplace_back(make_pair(id,s));&#xD;&#xA;      }&#xD;&#xA;      sort(list.begin(),list.end(),[&amp;amp;](const pair&amp;lt;int,int&amp;gt;a,const pair&amp;lt;int,int&amp;gt;b){&#xD;&#xA;          return a.second&amp;gt;b.second ||(a.second==b.second&amp;amp;&amp;amp;a.first&amp;lt;b.first);&#xD;&#xA;      });&#xD;&#xA;      vector&amp;lt;int&amp;gt;res;&#xD;&#xA;      for (int i=0;i&amp;lt;k;i++){&#xD;&#xA;          res.emplace_back(list[i].first);&#xD;&#xA;      }&#xD;&#xA;      return res;&#xD;&#xA;&lt;p&gt;}&#xA;};&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>题解-移动机器人-数组计算的三种思考方式方式(动态规划,贡献,前缀和)与相关证明</title>
				<link>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA/</link>
				<pubDate>Tue, 10 Oct 2023 08:04:17 +0800</pubDate>
				<guid>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/movement-of-robots/description/&#34;&gt;2731. 移动机器人&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;!-- toc --&gt;&#xD;&#xA;&lt;h1 id=&#34;前述条件&#34;&gt;前述条件&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;碰撞和&lt;a href=&#34;https://leetcode.cn/problems/last-moment-before-all-ants-fall-out-of-a-plank/description/&#34;&gt;1503. 所有蚂蚁掉下来前的最后一刻&lt;/a&gt;类似,注意到对于身份没有要求,所以可以直接认为两个机器人碰撞是交换了二者的身份,也可以认为是穿过去了&lt;/li&gt;&#xA;&lt;li&gt;因此能够得到机器人的最终位置,为了方便计算,我们排序&lt;/li&gt;&#xA;&lt;li&gt;数据量为$10^5$,暴力求解不现实&lt;/li&gt;&#xA;&lt;li&gt;以下是三种常用的解决方法,这三种思路最开始的进入方式不同,但是都能得出正确结果&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h1 id=&#34;两种对于距离的计算方法&#34;&gt;两种对于距离的计算方法&lt;/h1&gt;&#xA;&lt;p&gt;算法的时间复杂度均为$O(n)$&lt;/p&gt;&#xA;&lt;h2 id=&#34;动态规划&#34;&gt;动态规划&lt;/h2&gt;&#xA;&lt;h3 id=&#34;思考方式与证明&#34;&gt;思考方式与证明&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;假设已经计算出来了$a[i]$之前所有的机器人两两之间距离之和为$s$&lt;/li&gt;&#xA;&lt;li&gt;增加一个元素$a[i]$,观察其和之前的所有机器人之间的距离之和,能够发现&#xA;&lt;ol&gt;&#xA;&lt;li&gt;实际上就是与之前的每个元素计算距离&lt;/li&gt;&#xA;&lt;li&gt;$a[i]$与$a[0],a[1]&amp;hellip;.,a[i-1]$之间的距离实际上分别是是$a[i-1]$与$a[0]&amp;hellip;.,a[i-1]$之间的距离加上$a[i]$与$a[i-1]$之间的距离,共$i$个&lt;/li&gt;&#xA;&lt;li&gt;上述结论可以推导:&#xA;设$distance[i]$表示$a[i]$和$a[0],a[1]&amp;hellip;.,a[i-1]$之间的距离之和,有&#xA;$$ distance[i]=i*a[i]+distance[i-1] \distance[0]=0 $$&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;代码&#34;&gt;代码&lt;/h3&gt;&#xA;&lt;p&gt;可以看出来这个公式只与前一个状态有关,因此可以优化空间&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python3&#34; data-lang=&#34;Python3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sumDistance&lt;/span&gt;(self, nums: List[int], s: str, d: int) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mod&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1000000007&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(nums)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i,a &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(s):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            nums[i]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;d &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; s[i]&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;R&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;d  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sort()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        distance&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,n):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            distance&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(nums[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;nums[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]) &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;#这个方法对于只int的话4*(10**9)会超范围&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            distance&lt;span style=&#34;color:#f92672&#34;&gt;%=&lt;/span&gt;mod  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            res&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;distance&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;mod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;贡献距离法&#34;&gt;贡献距离法&lt;/h2&gt;&#xA;&lt;h3 id=&#34;思考方式&#34;&gt;思考方式&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;对于这种什么什么之和的问题可以考虑计算每个片段对结果的贡献&lt;/li&gt;&#xA;&lt;li&gt;在这个题目之中片段就是每个元素之间的距离,我们需要计算的就是这段距离在结果中出现了多少次&lt;/li&gt;&#xA;&lt;li&gt;为了方便理解将每次计算距离视为两点之间的连线,看片段上线的数目就知道这个片段的使用次数&lt;/li&gt;&#xA;&lt;li&gt;从$a[0]-a[1]$这一的角度来看:从$a[0]$连出去了$n-1$条线,每条线都经过了$a[1]$,所以得出$a[0]-a[1]$段的贡献是$n-1$&lt;/li&gt;&#xA;&lt;li&gt;从$a[1]-a[2]$的角度来看,$a[1]$连出去的$n-2$也就是$(n-i-1)$条线覆盖了$a[1]-a[2]$&#xA;&lt;ol&gt;&#xA;&lt;li&gt;但还不够,注意到$a[0]$发出去的线只有一条落在了$a[1]$上,剩下的线也覆盖了$a[2]$&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;希望确切地知道此时到底有多少条线覆盖了这段距离&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;证明&#34;&gt;证明&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;设$f[i]$表示$a[i]$到$a[i+1]$这段距离对结果的贡献次数&lt;/li&gt;&#xA;&lt;li&gt;同时可知$f[i]$也表示此时距离上面的线段数量&lt;/li&gt;&#xA;&lt;li&gt;从a[i]发出的所有向右的线都会做贡献,这个次数为$n-i$&lt;/li&gt;&#xA;&lt;li&gt;发现$a[i]$之前的线段,也就是参与了$f[i-1]$计算的线段,有一部分落在了$a[i]$上,剩下的部分继续参与$f[i]$的计算&lt;/li&gt;&#xA;&lt;li&gt;可知落在$a[i]$上的线段实际上是a[i]发出的指向左边的线段,其数量为$i$&lt;/li&gt;&#xA;&lt;li&gt;综上&#xA;$f[0]=n-i\f[i]=(f[i-1]-i+n)-i=f[i-1]-2*i+n$&lt;/li&gt;&#xA;&lt;li&gt;$$\displaystyle res=\sum_{i=0}^{n-2}f[i]*(a[i+1]-a[i])$$&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;code&#34;&gt;Code&lt;/h3&gt;&#xA;&lt;p&gt;可以看出只与前一个状态有关,进行空间优化&#xA;代码为了方便对于$f[i]$计算的是$a[i+1]$到$a[i]$&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sumDistance&lt;/span&gt;(self, nums: List[int], s: str, d: int) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      mod&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1000000007&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(nums)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i,a &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(s):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          nums[i]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;d &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; s[i]&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;R&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;d  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sort()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      pre&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          pre&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(pre&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;mod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(res&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(nums[i&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;nums[i])&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pre)&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;mod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;前缀和的形式化证明&#34;&gt;前缀和的形式化证明&lt;/h1&gt;&#xA;&lt;p&gt;下面是&lt;a href=&#34;https://leetcode.cn/problems/movement-of-robots/solutions/2304680/nao-jin-ji-zhuan-wan-pai-xu-tong-ji-pyth-we55/&#34;&gt;灵神的证明方式&lt;/a&gt;,与上面的证明相比更加数学,如下&#xA;$ (a[i]−a[0])+(a[i]−a[1])+⋯+(a[i]−a[i−1])=i⋅a[i]−(a[0]+a[1]+⋯+a[i−1])\$ $(a[0]+a[1]+⋯+a[i−1])$可根据前缀和求&#xA;下面是灵神的代码&lt;/p&gt;</description>
			</item>
			<item>
				<title>题解-英雄的力量</title>
				<link>https://noirzh.com/solution-power-of-heros/</link>
				<pubDate>Tue, 01 Aug 2023 06:31:49 +0800</pubDate>
				<guid>https://noirzh.com/solution-power-of-heros/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/power-of-heroes/description/&#34;&gt;2681. 英雄的力量&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;题目描述&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;给你一个下标从&lt;strong&gt;0&lt;/strong&gt;开始的整数数组&lt;code&gt;nums&lt;/code&gt;，它表示英雄的能力值。如果我们选出一部分英雄，这组英雄的&lt;strong&gt;力量&lt;/strong&gt;定义为：&lt;/p&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;i&lt;sub&gt;0&lt;/sub&gt;&lt;/code&gt; ，&lt;code&gt;i&lt;sub&gt;1&lt;/sub&gt;&lt;/code&gt; ，… &lt;code&gt;i&lt;sub&gt;k&lt;/sub&gt;&lt;/code&gt;&lt;/strong&gt; 表示这组英雄在数组中的下标。那么这组英雄的力量为 &lt;code&gt;&lt;strong&gt;max(nums[i&lt;sub&gt;0&lt;/sub&gt;],nums[i&lt;sub&gt;1&lt;/sub&gt;] ... nums[i&lt;sub&gt;k&lt;/sub&gt;])&lt;sup&gt;2&lt;/sup&gt; * min(nums[i&lt;sub&gt;0&lt;/sub&gt;],nums[i&lt;sub&gt;1&lt;/sub&gt;] ... nums[i&lt;sub&gt;k&lt;/sub&gt;])&lt;/strong&gt;&lt;/code&gt; 。&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;p&gt;请你返回所有可能的&lt;strong&gt;非空&lt;/strong&gt;英雄组的&lt;strong&gt;力量&lt;/strong&gt;之和。由于答案可能非常大，请你将结果对&lt;code&gt;&lt;strong&gt;10&lt;sup&gt;9 &lt;/sup&gt;+ 7&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;取余。&lt;/strong&gt;&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;思路&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;选取与顺序无关先排序&lt;/li&gt;&#xD;&#xA;&lt;li&gt;接下来只要枚举所有子序列的最大值的平方和最小值的乘积之和&lt;/li&gt;&#xD;&#xA;&lt;li&gt;注意到只和最大值和最小值有关&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;解题方法&lt;/h2&gt;&#xD;&#xA;&lt;ol&gt;&#xD;&#xA;&lt;li&gt;确定了子序列的最大值之后,我们只需要确定子序列里面各个值最小值出现了几次&lt;/li&gt;&#xD;&#xA;&lt;li&gt;也就是确定排序后的$nums[i]$必选且为最大值时,我们假设此时在答案中与除自身之外他的平方相乘的所有值之和为$pre_i$,此时有答案$res_i=nums[i]^2*(pre_i+nums[i])$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;不去管$pre_i$现在为多少,我们假设现在要选取的是$nums[i+1]$为最大值,则注意到对于子序列&#xD;&#xA;&lt;ol&gt;&#xD;&#xA;&lt;li&gt;如果不选$ nums[i] $,$ pre_i$也会和$nums[i+1]$相乘&lt;/li&gt;&#xD;&#xA;&lt;li&gt;如果选取$nums[i]$,对于所有$nums[i]$不是最小值的情况,$pre_i$也会和$nums[i+1]$相乘,而$nums[i]$是最小值的情况只有一个(也就是选取$i$和$i+1$两个)&lt;/li&gt;&#xD;&#xA;&lt;/ol&gt;&#xD;&#xA;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;根据以上的两个推理,我们能够得出 $$ \displaystyle res_{i+1}=nums[i+1]^2 \cdot (pre_i \cdot 2+nums[i]+nums[i+1]) \\ pre_{i+1}=pre_i\cdot 2+nums[i] $$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;$res=\displaystyle\sum^{n}_{i=0} res_i $&lt;/li&gt;&#xD;&#xA;&lt;/ol&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;时间复杂度$O(nlogn)$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;空间复杂度$O(1)$&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;Code&lt;/h2&gt;&#xD;&#xA;&lt;div&gt;&#xD;&#xA;&lt;div&gt;&#xD;&#xA;&lt;div&gt;&lt;div&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def sumOfPower(self, nums: List[int]) -&amp;gt; int:&#xD;&#xA;        mod=1000000007&#xD;&#xA;        nums.sort()&#xD;&#xA;        pre=0&#xD;&#xA;        res=0&#xD;&#xA;        for num in nums:&#xD;&#xA;            res=(res+(pre+num)*(num**2)&#xD;&#xA;            pre=(pre*2+num&#xD;&#xA;        return res&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution {&#xD;&#xA;public:&#xD;&#xA;    int sumOfPower(vector&amp;lt;int&amp;gt;&amp;amp; nums) {&#xD;&#xA;        const int mod=1e9+7;&#xD;&#xA;        sort(nums.begin(),nums.end());&#xD;&#xA;        int res=0,pre=0;&#xD;&#xA;        for (long num:nums){&#xD;&#xA;            res=(res+(num*nu&#xD;&#xA;            pre=(pre*2+num&#xD;&#xA;        }&#xD;&#xA;        return res;&#xD;&#xA;    }&#xD;&#xA;};&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>题解-在二叉树中分配硬币-深度优先搜索,自底向上考虑</title>
				<link>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E5%9C%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%88%86%E9%85%8D%E7%A1%AC%E5%B8%81/</link>
				<pubDate>Fri, 14 Jul 2023 23:46:22 +0800</pubDate>
				<guid>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E5%9C%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%88%86%E9%85%8D%E7%A1%AC%E5%B8%81/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/distribute-coins-in-binary-tree/description/&#34;&gt;979. 在二叉树中分配硬币&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;!-- toc --&gt;&#xD;&#xA;&lt;h1 id=&#34;思路&#34;&gt;思路&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;考虑最后计算成本的时候实际上是计算的是每个节点对硬币的操作数&lt;/li&gt;&#xA;&lt;li&gt;每个节点只需要一个硬币,如何确定多出来的或少的硬币的流向&lt;/li&gt;&#xA;&lt;li&gt;考虑自底向上,叶子节点只需要一个硬币,这样就能向父节点要硬币或者向父节点送硬币,之后父节点变成了叶子节点(其子节点已完成使命)&lt;/li&gt;&#xA;&lt;li&gt;设一个值为$Need$表示需要向上移或者向上要的硬币数,根据以上推论我们能够得到如下公式,正数表示需要向上移动,负数表示需要上方向下移动&#xA;$$Need_{节点}=Need_{子节点}+val-1$$&lt;/li&gt;&#xA;&lt;li&gt;每次将一个节点处理完就将Need的绝对值加入到操作数之中&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h1 id=&#34;code&#34;&gt;Code&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;distributeCoins&lt;/span&gt;(self, root: Optional[TreeNode]) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;dfs&lt;/span&gt;(node:TreeNode):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; node&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            left&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;dfs(node&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;left)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            right&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;dfs(node&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;right)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;res&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;abs(left)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;abs(right)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; right&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;left&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;node&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;val&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dfs(root)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;res&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;public:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    int res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    int dfs(TreeNode&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; root){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;!&lt;/span&gt;root) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        int left&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;dfs(root&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;left);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        int right&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;dfs(root&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;right);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;abs(left)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;abs(right);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; left&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;right&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;root&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;val&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    int distributeCoins(TreeNode&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; root) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dfs(root);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
	</channel>
</rss>
