自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

支锦铭的博客

中国第一矮穷挫胖菜

  • 博客(370)
  • 收藏
  • 关注

原创 LeetCode - 解题笔记 - 216 - Combination Sum III

的按尺寸的枚举方案,并且在深入过程中维护当前累加值acc和target的差距,并且在满足条件的终止条件同时判定枚举序列尺寸和acc与target的关系。的核心,即固定候选数字的个数且不放回,选择满足target的方案。Solution 1的Python实现。所以本题仍然是dfs搜索,但是使用。

2022-11-01 19:19:20 317 1

原创 LeetCode - 解题笔记 - 215 - Kth Largest Element in an Array

第二个思路:堆排序(优先队列),在线性时间完成构建,对数时间内完成更新,因此我们可以快速建立一个堆,然后将堆顶元素删除k-1次,也可以在近似线性时间内得到结构。Solution 2的Python实现,本着想使用内建的heapify实现,但是只能处理小根堆。本题有时间限制,也就是需要在线性时间内完成至少部分排序和查找工作。为了方便确定最大值,因此使用大根堆。这次直接使用了C++内建的。第一个思路:不稳定的快速排序。Solution 1的Python实现。

2022-11-01 19:18:38 376

原创 LeetCode - 解题笔记 - 214 - Shortest Palindrome

启发:找到一个s的最短后缀子串s[i:],其中s[:i]为一个回文串,这样额外增加的前缀就是这个最短子串的逆序,整体长度最短。就是选择了一个比较大的base进行十进制转换,并用mod约束(假设碰撞概率极低),这样可以基于历史结果快速计算新前缀的哈希。本题中,我们就是试图使用该算法找到回文串(query就是自己的逆序),需要一个简单的哈希计算方法。观察:任意输入都有平凡解:s[1:]的逆序,因此新增加的前缀必然比s的长度小(最大为s-1)【官方题解】KMP算法,暂时跳过不学习,等需要的时候再学习。

2022-11-01 19:17:22 378

原创 LeetCode - 解题笔记 - 213 - House Robber II

基于此,需要同时判断两个初始值不同的策略链:其中一个抢第一个房子(那么第二个就不能抢),那么最佳结果要考察倒数第二个状态;其中一个不抢第一个房子(那么第二个房子一定要抢),最佳结果要考察倒数第一个状态。的变体,额外增加了一个条件:当抢第一个房子时,最后一个房子不能抢。Solution 1的Python实现。

2022-11-01 19:16:12 111

原创 LeetCode - 解题笔记 - 212 - Word Search II

根据题目给出的输入大小,直接在单个词DFS上套一个遍历是肯定会超时的,因此需要简化单词的查询逻辑:前缀树。DFS的深入遍历过程可以直接关联前缀树的向下探查和向上递归的过程。的办法做了更多的剪枝。在每个节点记录尚未检查的前缀的个数,并在dfs期间更新之。如果出现了0的情况即所有的后续前缀均已经检查完毕而完全跳过后续搜索,实现更小的搜索空间。的扩展,针对一个词的判定扩展到整个列表,并找到所有的词。的实现改进,增加了一些额外的状态读写接口就可以直接用了。Solution 1的Python实现,参考了。

2022-11-01 19:15:15 250

原创 LeetCode - 解题笔记 - 211 - Design Add and Search Words Data Structure

本题在实现中遇到了一个奇怪的剪枝优化:如果当前搜索位不是通配符,仍然需要对枚举结果进行判定。否则会出现TLE的问题(实测是OJ的耗时玄学……但是本题额外引入了一个通配符,一个通配符对应一个字符位,因此我们需要通过DFS枚举搜索。Solution 1的Python实现(这个版本也会遇到神奇的OJ耗时玄学……根据数据结构的功能,可以基本判定其内部实现是一个前缀树,可以使用。

2022-11-01 19:14:02 354

原创 LeetCode - 解题笔记 - 210 - Course Schedule II

基于现在的有向边定义,最小序节点就是最优先的课程。的具体版,也就是要输出具体的拓扑排序结果。Solution 1的Python实现。

2022-11-01 19:13:20 106

原创 LeetCode - 解题笔记 - 209 - Minimum Size Subarray Sum

因为是寻找最优的连续区间,我们可以通过双指针维护这个考察区间,并寻找最优解。Solution 2Solution 1的Python实现

2022-11-01 19:12:30 79

原创 LeetCode - 解题笔记 - 208 - Implement Trie (Prefix Tree)

Solution 1的Python实现。

2022-11-01 19:11:21 111

原创 LeetCode - 解题笔记 - 207 - Course Schedule

其实整体意思了解下来,就是希望我们找到可能存在的“逻辑环”。尽管之前我们已经学习了如何从链表中寻找环,但是在本题中仍然需要考虑一连多的情形,即从有向图中寻找可能的环。这里就需要使用“拓扑排序”来寻找有向图中的环了。给定的输入数字即节点数量(一门课一个节点),而前提条件序列即为边,基于这一组内容完成一次拓扑排序。Solution 1的Python实现。本体需要着重关注存在环的情形。

2022-11-01 19:09:45 89

原创 LeetCode - 解题笔记 - 206 - Reverse Linked List

因此可以在此题实现的基础上进行改动,简化判定和后处理(从边界重新连接)的逻辑。的简化版,默认边界为头和尾,从头到尾进行逆转。Solution 1的Python实现。

2022-09-27 11:12:37 80

原创 LeetCode - 解题笔记 - 205 - Isomorphic Strings

那么就需要维护两个哈希表,保证s和t中的对应是唯一确定的。于此同时可以发现,唯一确定的关系不仅仅可以保证对应替换,还能够保证字符串相同。因为如果二者的对应关系确定但形式不相同,那么势必会造成哈希表的对应不一致(逻辑完备了!因此可以直接省去最后的检查字符串。这个题的思路很简单,二者的形式(比如AABB)一样,那么我们可以根据s对应替换t中的字符,得到的一个和s一模一样的字符串(否则就不对)。如果能对应替换,检查两字符串是否相同就好。Solution 1的Python实现。

2022-09-27 11:11:35 88

原创 LeetCode - 解题笔记 - 204 - Count Primes

必为合数,预先标记尽可能多的数字,以减少实际判定质数的次数。但是判定这里不需要也不能试遍所有数字(2次复杂度,会TLE),可以将这个范围缩小到。此外,对埃氏筛还有进一步优化的线性筛,这个等以后有用的时候再进一步学习了。但是目前这个方法因为题目范围修改已经被判定TLE了,因此只能进一步优化了。最简单的枚举方法,根据给定的数字从2一直枚举判定。埃氏(Eratosthenes)筛,基于观察:当。开始标记以尽可能减少标记的次数,因此其更小的倍数。这个题是我栽过坑的,一定要好好学习!的标记轮次中被标记到。

2022-09-27 11:10:45 215

原创 LeetCode - 解题笔记 - 203 - Remove Linked List Elements

比较简单的一道题,需要两个过程:目标元素的判定和对应元素的移除,这在过去的题目中都有涉及。Solution 1的Python实现。

2022-09-27 11:09:54 98

原创 LeetCode - 解题笔记 -202- Happy Number

中的快慢指针思路,而且平方和计算的演化路径唯一确定,可以不使用额外的保存空间处理之。至于是否循环或到达1是唯二的两种情形,已经在官方题解中。第一个部分,直接使用模拟思路即可;Solution 1的Python实现。给出了详细分析,不再赘述。

2022-09-27 11:08:40 206

原创 LeetCode - 解题笔记 -201- Bitwise AND of Numbers Range

整体的规律实际上就是找所有数字(实际上就是range左右端点)的公共前缀。因为只要给定数字是连续的,那么一定存在两个相邻数字,在公共前缀的后一位,小的是0111……,因此最后按位与的结果就是这些数字的公共前缀后面补零。其实和上面位移的思路是一样的,只是换了一种方法:不断地对n与n-1进行与运算,直到变成m或者比m小,此时n保留的就是公共后缀。针对给定的两个数,不断右移,直到二者的结果一样,对应的就是公公前缀。最后的结果就是想对应的部分作为前缀补零左移即可。的思路是一样的,去掉右侧1的目的不同。

2022-09-12 16:35:23 175

原创 LeetCode - 解题笔记 - 200 - Number of Islands

【备注】查看官方题解,还给出了并查集的思路,也就是通过并查集标记所属团体,并通过不断地find和union将关联集合数量减至最低(但是效率觉得反而变差了)也就根据给定map的四邻域判断有多少个联通分区域。使用BFS在没有搜索过的“1”标记点上开始BFS,并不断标记找过的位置。调用BFS的次数即为岛屿总数。Solution 1的Python实现。非常经典的BFS模版题。

2022-09-12 16:34:28 156

原创 LeetCode - 解题笔记 - 199 - Binary Tree Right Side View

这道题一开始我甚至没有搞清楚到底要干啥,最后才明白是“从右边”看。也就是找到每一层最右侧的一个节点。这个正好和之前的level遍历的方法相契合,因此可以直接使用BFS解决该问题。整体思路就是,按照层次逐渐向下遍历,并保存每一层最右侧(最后一个)节点的结果。Solution 1的Python实现。

2022-09-12 16:33:40 114

原创 LeetCode - 解题笔记 - 198 - House Robber

这不是我能做出来的数学题。官方题解参考整体解法就是,我们需要找到因子10的个数,由此需要找到因子2和因子5个数较小值,即5的个数。而这一过程可以归约到由1到n中每个数因子5的个数之和。另外可以由更简便直观的优化方式实现,这里作为参考。Solution 2Solution 1的Python实现

2022-09-12 16:31:41 136

原创 LeetCode - 解题笔记 - 191 - Number of 1 Bits

这个运算的“将n最后一个1变成0”的特性,以更少的循环次数完成计数。暴力检查,逐个位进行检查,然后计算其中1的个数。Solution 1的Python实现。Solution 2的Python实现。

2022-08-16 15:32:05 93

原创 LeetCode - 解题笔记 - 190 - Reverse Bits

分治法,即第一次一位一组,每两组完成一次交换;接着两位一组,四位一组,八位一组,十六位一组。任何一个数都能通过5组位操作实现翻转(上一种解法的上界是32种)给予按位操作的进一步优化,一开始我没想明白,然而看了解法之后发现这个已经很上难度了……对输入从低到高读取,然后用1取出,并对应地左移若干位,然后或操作相加。Solution 1的Python实现。Solution 2的Python实现。简单难度的实现,直接按位操作。...

2022-08-16 15:30:48 117

原创 LeetCode - 解题笔记 - 189 - Rotate Array

对上述方式进一步简化,我们可以通过一个状态变量来保存转换结果但是很快发现经过一定次数后,调换会形成一个循环,并且经过观察发现一共有。题目中希望本题至少实现三种方法,其中一种就是直接暴力地使用一个额外的新数组保存临时结果,因此不表。进行切分分别进行翻转完成旋转。需要做的就是实现一个in-place的翻转函数。给定指定的旋转量k,那么可以通过翻转整个数组→按照。Solution 1的Python实现。Solution 2的Python实现。...

2022-08-16 15:29:34 113

原创 LeetCode - 解题笔记 - 188 - Best Time to Buy and Sell Stock IV

然后整体看一下,本体实际上就是对过去三个题的统合。K=1时整个过程退化到寻找最理想的一次交易(最小的一次buy和其后最大的一次sel);K=2时整个过程退化到上一个题;K>n/2时整个过程退化到任意次交易。的进一步通用化,在指定次交易的范围内获得最大收益,实际上我们可以把之前一个题的buy和sell从两个扩展到一个k长度的数组。Solution1的Python实现。...

2022-07-28 15:02:04 155

原创 LeetCode - 解题笔记 - 187 - Repeated DNA Sequences

因为题目限制了长度为10,涉及到四种位态,因此可以一个2位表示共20位的子串来保存当前状态,一个int整型数就能解决问题,能够优化扫描时间(滑窗)的同时也能节省存储(整型数的哈希)从初始位置不断向后寻找一个指定长度的子串,并用哈希表进行计数。满足要求时保存结果(注意避免重复判定的问题)。我想了几个能够简化子串存取的方法(滑窗),但是都不能实际优化复杂度。【官方题解参考】官方题解基于位操作给出了一个滑窗优化方案。由于题目的限制非常直观,因此解法也非常直观。Solution2的Python实现。...

2022-07-28 15:01:27 135

原创 LeetCode - 解题笔记 - 179 - Largest Number

比较直观的想法就是从最高位进行排序,但是题目里的第二个例子给出了一个这种直觉的反例3和30,按照该逻辑排序应该是303,但是最优的方案应该是330。的官方题解方案的方法,对连续的拼接方案进行比较。题解中给出了排序关系的充分性与传递性的证明了其全序关系,因此可以保证其效果。Solution1的Python实现。为了覆盖这种情形,这里参考。...

2022-07-28 15:00:32 113

原创 LeetCode - 解题笔记 - 174 - Dungeon Game

【官方题解参考】正眼一看就会知道是动态规划,但是实际考虑的时候会发现一个问题:从左上到右下的方向的规划计算无法在后续确认的情况下完全确认。最优路径会随着后续的结果的选择而不断发生变化,无后效性不成立。反过来看,实际上本体就是在求取初始值。因此如果将规划方向从左上变成右下,整个逻辑就通了……最优子结构:dp[i][j]dp[i][j]dp[i][j],从终点(右下)到达当前点所需要的最小能量值初始值:dp[m−1][n−1]=max⁡(1,1−dungeon[m−1][n−1])dp[m-1][n-1] =

2022-06-10 17:58:47 157

原创 LeetCode - 解题笔记 - 173 - Binary Search Tree Iterator

封装的二叉树中序遍历,根据题目限制,需要使用迭代实现方法(还是应该学习一下迭代写法)。至于Morris遍历法,考虑到其会修改原有树的结构,不符合迭代器的设计。Solution 2Solution 1的Python实现...

2022-06-10 17:57:38 87

原创 LeetCode - 解题笔记 - 172 - Factorial Trailing Zeroes

这不是我能做出来的数学题。官方题解参考整体解法就是,我们需要找到因子10的个数,由此需要找到因子2和因子5个数较小值,即5的个数。而这一过程可以归约到由1到n中每个数因子5的个数之和。另外可以由更简便直观的优化方式实现,这里作为参考。Solution 2Solution 1的Python实现...

2022-06-04 01:37:49 55

原创 LeetCode - 解题笔记 - 171 - Excel Sheet Column Number

将 0168. Excel Sheet Column Title 反过来了。也就是字符串数字的特别版,注意转换基底是26,并且从1到26,因此需要注意加一减一的问题。本题输入限制了数字类型不超过int,因此可以大肆处理不需要考虑转型问题了。Solution 2Solution 1的Python实现...

2022-06-04 01:36:52 90

原创 LeetCode - 解题笔记 - 169 - Majority Element

Solution 1这个问题和我之前上算法课的时候遇到的问题差不多,直觉上可以用排序去做,但是排序实现往往需要至少对数复杂度的空间占用。但是有一个奇技淫巧:使用快排中随机选择pivot的方法随机选择一个候选判定,这个时候,随机化算法的期望选择次数只有2。证明方法请查阅快排pivot选择方法的分析时间复杂度:O(N)O(N)O(N),其中NNN为输入序列的元素个数,随机化选择的期望为常数次,但是众数判定(计数)需要线性时间空间复杂度:O(1)O(1)O(1),仅维护常数个状态量class So

2022-05-28 14:45:26 100

原创 LeetCode - 解题笔记 - 168 - Excel Sheet Column Title

Solution 1实际上就是类似将数字转为对应字符串的题,区别在于两点:26进制,这个没有问题余数方面,索引范围是1~26,因此需要提前减1方便确定余数时间复杂度:O(log⁡26columnNumber)O(\log_{26} columnNumber)O(log26​columnNumber),这个没什么说的空间复杂度:O(1)O(1)O(1),这里想表达除了结果之外仅维护常数个状态量,但是实际复杂度需要考虑字符串的实现class Solution {public: st

2022-05-28 14:44:24 87

原创 LeetCode - 解题笔记 - 167 - Two Sum II - Input Array Is Sorted

Solution 1双指针+贪心策略。初始化:已知输入序列有序,两个指针分别在两个端点判断:计算两个指针指向数字的和如果相等,范围位置,注意1-indexed如果更小,则向右移动左指针如果更大,则向左移动右指针时间复杂度:O(n)O(n)O(n),其中nnn为输入数组的长度,两个指针实际完成对数组的一次遍历空间复杂度:O(1)O(1)O(1),仅维护常数个状态量class Solution {public: vector<int> twoSum(vector

2022-05-28 14:42:15 101

原创 LeetCode - 解题笔记 - 166 - Fraction to Recurring Decimal

Solution 1分数除法,先学习了。【官方题解】首先最基本的,根据实际的取值范围存在溢出可能,因此先整体转为长整型。然后判断结果是否为整数,即可直接计算分数除法然后输出。否则,按照“符号位→整数部分和小数点→小数部分→循环节确认”符号位,经典异或运算符应用整数部分和小数点,直接除法分数部分,根据余数确定逐个位的结果循环节确认,基于规律“同余数的结果必然相同”,因此一旦出现相同余数也就意味着存在循环节,用哈希表保存第一次出现的位置,根据该位置插入括号时间复杂度:O(M)O(M)O(

2022-05-15 02:53:51 109

原创 LeetCode - 解题笔记 - 165 - Compare Version Numbers

Solution 1字符串处理,基本的思路就是按照点进行分割,并逐个位置的rev号码转为int进行比较,从而比较整体。但是由于c++的split要自己实现,且保存每一段的空间占用没有必要,因此可以直接一边确定rev号一边确定大小。整体思路就是一直整理到小数点以确定rev号,然后比较大小,注意段数不相等时的缺省设置。时间复杂度:O(N+M)O(N + M)O(N+M),其中NNN和MMM分别为两个字符串输入的长度,各完成一次现行遍历空间复杂度:O(1)O(1)O(1),仅维护常数个状态变量cl

2022-05-15 02:52:45 164

原创 LeetCode - 解题笔记 - 164 - Maximum Gap

Solution 1本体要求线性时间的排序过程,因此需要使用基数排序或者桶排序。最低有效位的基数算法参考:1.10 基数排序 | 菜鸟教程 (runoob.com)在完成排序之后,找到相邻有序的两个数字的最大间隔时间复杂度:O(n)O(n)O(n),其中nnn为输入数组长度,题目要求线性复杂度空间复杂度:O(n)O(n)O(n),其中nnn为输入数组长度,题目要求线性复杂度class Solution {public: int maximumGap(vector<int&gt

2022-05-04 21:06:00 181

原创 LeetCode - 解题笔记 - 162 - Find Peak Element

Solution 1由于题目要求对数时间复杂度,因此本体必然是一个二分查找,由于和 0153. Find Minimum in Rotated Sorted Array 的设置很像,因此我们只需要稍稍调整一下就好。仍然是贪心的思想,和后一项(或者前一项,不失一般性)进行比较,判断其在升序列还是降序列,前者则向后寻找peak,后者则向前寻找peak。至于只比一个,由于给定要求每个数字不一样,因此只要从一侧进行确定,另一个的结果并不影响升降序列的判定,还能节省空间;至于和+1比,是因为现有的mi

2022-04-29 16:49:20 185

原创 LeetCode - 解题笔记 - 160 - Intersection of Two Linked Lists

Solution 1这道题的题目解释很迷,既没说清楚相交点的情况(实际上是完全相同的实例),又没说清楚不想叫情况到底返回什么(前面说null后面有说0,实际上就是null),还把第一个示例用例给弄错了。本题的判断关键就是第一个相同的节点实例的指针。简单方案就是使用哈希表保存第一个链表的节点,然后遍历第二个链表找到第一个相同节点就好了。但是题目希望常数空间复杂度,那么就需要使用指针来判断,这里和 0141. Linked List Cycle 的题目要求和思路实际上一样。两个指针分别从两个

2022-04-22 17:13:27 429

原创 LeetCode - 解题笔记 - 155 - Min Stack

Solution 1【参考官方题解】这道题一开始我甚至觉得要自己实现一个栈……然而看了题解之后才发现是不用的。【难点】需要根据栈内元素的变化动态地维护最小值。【朴素解法】额外使用一个栈,保存每一次插入数据的最小值结果【优化解法】【参考】这样才是面试的时候才会被问到的问题吧……使用差值进行维护,争产情况应出现正差值,根据min和差值恢复当前数据;如果出现负差值,即出现了新的最小值,根据min和差值恢复原来的min,当前数据即现在的min【注意】额外的问题,计算插值可能出现INT_MIN-INT_MA

2022-04-08 13:34:38 120

原创 LeetCode - 解题笔记 - 154 - Find Minimum in Rotated Sorted Array II

Solution 10153. Find Minimum in Rotated Sorted Array 的变体,加入了duplicate的情形。这种调整下,影响到的就是mid和right值相等时的判断,因为right有可能时旋转过程中包含mid的连续相等元素中的任何一个。方案:因此,这里使用一个贪心的思想:将右边界收缩,强制找到一个可能更小或者更大的mid。策略调整:如果当前mid的值比right小,说明当前mid在旋转位置或者其右侧,因此需要继续搜索包含当前位置的左区间。如果当前m

2022-04-01 10:54:05 696

原创 LeetCode - 解题笔记 - 153 - Find Minimum in Rotated Sorted Array

Solution 1由于题目要求限制时间复杂度为对数复杂度,因此本体的搜索过程必然要使用二分查找。只是本体的难度在于整体数组可能存在rotate的情况。需要对应的调整考察区间的策略。观察:当进行旋转时,旋转位置的两侧序列都有序,且右侧的所有元素都小于左侧元素(不考虑duplicate)策略调整:如果当前mid的值比right小,说明当前mid在旋转位置或者其右侧,因此需要继续搜索包含当前位置的左区间。如果当前mid的值比right大,说明其必然在旋转位置左侧,因此需要考察当前位置右侧的部分。

2022-04-01 10:53:25 693

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除