<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>数据结构 on huluhuluu</title>
        <link>https://my-blog-p39q.vercel.app/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</link>
        <description>Recent content in 数据结构 on huluhuluu</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Thu, 26 Feb 2026 12:00:00 +0800</lastBuildDate><atom:link href="https://my-blog-p39q.vercel.app/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>算法刷题小结</title>
            <link>https://my-blog-p39q.vercel.app/p/leetcode-summary/</link>
            <pubDate>Thu, 26 Feb 2026 12:00:00 +0800</pubDate>
            <guid>https://my-blog-p39q.vercel.app/p/leetcode-summary/</guid>
            <description>&lt;h1 id=&#34;常见的一些小结&#34;&gt;常见的一些小结&#xA;&lt;/h1&gt;&lt;h1 id=&#34;1-各种更新查询&#34;&gt;1. 各种更新/查询&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;前缀和:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适合频繁查询和不频繁更新的场景: 区间查询，单点更新。&lt;/li&gt;&#xA;&lt;li&gt;维护一个前缀和数组，查询时通过前缀和差值实现高效查询。&lt;/li&gt;&#xA;&lt;li&gt;时间复杂度：查询 O(1)，更新 O(n)。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;差分：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适合频繁更新和不频繁查询的场景: 区间更新，单点查询。&lt;/li&gt;&#xA;&lt;li&gt;维护一个差分数组，更新时通过差分数组实现高效更新。&lt;/li&gt;&#xA;&lt;li&gt;时间复杂度：更新 O(1)，查询 O(n)。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;树状数组：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适合频繁更新和查询的场景：单点更新，区间查询。&lt;/li&gt;&#xA;&lt;li&gt;维护一个辅助数组，利用lowbit操作实现高效更新和查询。&lt;/li&gt;&#xA;&lt;li&gt;时间复杂度：更新和查询均为 O(log n)。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;线段树：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适合频繁更新和查询的场景：单点更新，区间查询。&lt;/li&gt;&#xA;&lt;li&gt;维护一个树形结构，支持高效的区间操作。&lt;/li&gt;&#xA;&lt;li&gt;时间复杂度：更新和查询均为 O(log n)。&lt;/li&gt;&#xA;&lt;li&gt;加上Lazy Tag可以支持区间更新，时间复杂度仍为 O(log n)。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;2-常见算法&#34;&gt;2. 常见算法&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;二分查找：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;通常是直接难以求得结果，但是能较快验证结果的场景，通过不断缩小搜索范围来找到目标元素或满足条件的边界。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;双指针：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适用于有序数组或需要同时遍历两个序列的场景，通过两个指针分别从不同方向遍历数组，寻找满足条件的元素对。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;滑动窗口：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适用寻找满足条件的连续子序列的场景，通过维护一个窗口来动态调整子序列的范围，寻找满足条件的最优解。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&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;/li&gt;&#xA;&lt;li&gt;分治算法：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可以将当前问题分解为更小的子问题，并且能够在处理完子问题后快速合并结果的场景，如归并排序、快速排序等。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;3-难一点的算法&#34;&gt;3. 难一点的算法&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;单调栈：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适用于需要维护一个单调递增或单调递减序列的场景，时间复杂度 O(n)。&lt;/li&gt;&#xA;&lt;li&gt;根据题目查看是否有局部单调性。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;贪心算法：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;每一步最优选择最后能得到全局最优解的场景，都比较难想。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;动态规划：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;最优化问题&lt;/strong&gt;，最难的是根据题目找规律，从而设计状态并且进行计算状态转移方程。&lt;/li&gt;&#xA;&lt;li&gt;很多题的状态需要根据题目进行部分变化，再进行设计。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;并查集：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适用于需要处理元素分组或连接关系的场景，时间复杂度 O(α(n))。&lt;/li&gt;&#xA;&lt;li&gt;通过维护一个数组来表示元素所属的集合，并提供合并和查询操作，适合解决一些与集合关系相关的问题，如连通性等。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;数学：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;排列组合、根据性质缩小搜索空间等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;博弈问题：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;双人、状态有限、信息完全(无随机性)、不平局/双赢 的情况必有先手/后手必胜策略&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;上述情况可以举例找规律，并且有一个先手窃取后手使用反证法证明，先手必赢的方法，内容见&lt;a class=&#34;link&#34; href=&#34;bilibili.com/video/BV1eGZSB6EnL/?spm_id_from=333.1391.0.0&#34; &gt;漫士沉思录&lt;/a&gt;，下面例子从该视频学习。&lt;/li&gt;&#xA;&lt;li&gt;例如，两人从两堆糖果轮流取糖果，最后取完最后一堆糖果的人获胜。每次可以从任意一堆取任意数量的糖果，但不能同时从两堆取。分析这个游戏的策略:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;先考虑糖果数为(0,k) 或者(k,0) 的情况，先手直接取完获胜。&lt;/li&gt;&#xA;&lt;li&gt;考虑糖果数为(1,1) 的情况，先手无论取哪堆糖果，都会让后手处于(0,1) 或者(1,0) 的情况，后手直接取完获胜。&lt;/li&gt;&#xA;&lt;li&gt;考虑糖果数为(2,2) 的情况，先手无论取哪堆糖果，都会让后手处于(1,2) 或者(2,1) 的情况，后手必须取另一堆的1个糖果使情况变成(1,1)，否则先手直接取完获胜。(1,1)此时是后手必赢的情况。&lt;/li&gt;&#xA;&lt;li&gt;考虑糖果数为(2,3) 的情况，先手取成(2, 2)，让后手处于(2,2) 的情况，使先手必赢。&lt;/li&gt;&#xA;&lt;li&gt;以此类推，可以发现当两堆糖果数相等时，先手必赢；当两堆糖果数不相等时，后手必赢。策略是将糖果数量调整为相等的状态。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
