![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
经典算法题
文章平均质量分 72
你好世界wxx
Just do it!
展开
-
【经典算法题】去除重复字母
【经典算法题】去除重复字母Leetcode 0316 去除重复字母题目描述:Leetcode 0316 去除重复字母分析本题的考点:栈、贪心算法。这里使用栈解决该问题,从左向右遍历s,结果存储在栈stk中,使用哈希表ins表示某个字符当前是否在stk中,为了判断后面是否还存在某个字符,还需要一个哈希表last表示某个字符在s中最后出现的位置。假设当前遍历到s[i],如果栈顶元素是c,并且c>s[i]且s中后面的字符还存在c,则可以将c删掉,继续考虑下一个栈顶元素,这样原创 2021-12-24 20:32:08 · 2054 阅读 · 0 评论 -
【经典算法题】整数反转
【经典算法题】整数反转Leetcode 0007 整数反转题目描述:Leetcode 0007 整数反转分析本题的考点:数学。每次取出x的最低位加到结果中即可,即如果结果存储在r中的话,r=r×10+x%10r = r \times 10 + x \% 10r=r×10+x%10,然后让x/=10x/=10x/=10,直到x为0为止。因为不能使用64位整数,所以我们需要考虑边界情况,因为反转后可能越界,存在两种越界情况:(1)假设int的最大值为INT_MAX,则当r×1原创 2021-12-23 15:41:10 · 911 阅读 · 0 评论 -
【经典算法题】最小覆盖子串
【经典算法题】最小覆盖子串Leetcode 0076 最小覆盖子串题目描述:Leetcode 0076 最小覆盖子串分析本题的考点:滑动窗口。这一题和LeetCode 0030 串联所有单词的子串十分类似。区别有两点:(1)这一题窗口中是字符,不是字符串;(2)这一题窗口中可以有多余字符,而LC30要求窗口内单词种类和次数与给定的完全相同。本题可以使用双指针算法中的滑窗解决,滑窗为[j, i],这里的j是满足题意最大的j,假设窗口内包含t中所有字符,则i增加的时候,j不会减原创 2021-12-23 15:12:05 · 864 阅读 · 0 评论 -
【经典算法题】最长有效括号
【经典算法题】最长有效括号Leetcode 0032 最长有效括号题目描述:Leetcode 0032 最长有效括号分析本题的考点:栈。首先,对于只含有小括号的序列,我们应该清楚序列时合法的,需要满足两个条件:(1)左右括号数量相等;(2)任意前缀中左括号数量一定大于等于右括号数量。第一步我们应该将整个括号序列分段:从左向右找到第一个前缀中右括号数量大于左括号数量的位置,这个前缀是第一个分段;然后继续对后面的序列进行这样的操作,这样我们可以将整个序列划分成多个分段,可以原创 2021-12-19 16:26:44 · 720 阅读 · 0 评论 -
【经典算法题】单词搜索
【经典算法题】单词搜索Leetcode 0079 单词搜索题目描述:Leetcode 0079 单词搜索分析本题的考点:递归回溯。首先我们枚举单词的起点,一共有n×mn \times mn×m个起点,然后从该起点开始暴搜,第一次最多有4个方向可以递归,之后最多有3个方向可以递归,因为不能往回搜。确定起点后,对于该次暴搜,怎样保证我们不搜索之前已经搜索过的位置呢?我们可以将board中相应的位置变为一个特殊字符,比如.,表示已经被搜过了,之后回溯的时候再恢复即可。代码原创 2021-12-17 18:42:55 · 1516 阅读 · 0 评论 -
【经典算法题】零钱兑换
【经典算法题】零钱兑换Leetcode 0322 零钱兑换题目描述:Leetcode 0322 零钱兑换分析本题的考点:背包问题。完全背包问题,amout为容量;物品体积为coins[i],价值为1。本题和Leetcode 0279 完全平方数十分类似,可以参考LC279的分析。注意本题和Leetcode 0518 零钱兑换 II的区别,LC518让求得是体积恰好是m的方案数,本题求的是体积恰好是m需要用的最少硬币数。代码C++class Solut原创 2021-12-15 21:49:15 · 2506 阅读 · 0 评论 -
【经典算法题】多边形三角剖分的最低得分
【经典算法题】多边形三角剖分的最低得分Leetcode 1039 多边形三角剖分的最低得分题目描述:Leetcode 1039 多边形三角剖分的最低得分分析本题的考点:动态规划。分析如下:代码C++class Solution {public: int minScoreTriangulation(vector<int>& w) { int n = w.size(); vector<vector原创 2021-12-13 22:33:11 · 512 阅读 · 0 评论 -
【经典算法题】编辑距离
【经典算法题】编辑距离Leetcode 0072 编辑距离题目描述:Leetcode 0072 编辑距离分析本题的考点:动态规划。用a表示word1,用b表示word2,分析如下:代码C++class Solution {public: int minDistance(string a, string b) { int n = a.size(), m = b.size(); a = ' ' + a, b = ' '原创 2021-12-12 14:14:55 · 1028 阅读 · 0 评论 -
【经典算法题】灯泡开关
【经典算法题】灯泡开关Leetcode 0319 灯泡开关题目描述:Leetcode 0319 灯泡开关分析本题的考点:数学。一个灯泡x最后是亮的 ⟺ \iff⟺它被按奇数次 ⟺ \iff⟺它的约数个数是奇数。因此最后所有约数个数是奇数个的灯泡是亮的,比如5个灯泡被按5次,1、4灯泡就是亮的,因为1只有1这一个约数,4有1、2、4三个约数。下面考虑约数个数为奇数的数据有什么特点:如果一个数N可以质因数分解为 p1α1∗p2α2∗...∗pkαkp_1^{\al原创 2021-12-10 21:03:40 · 1203 阅读 · 0 评论 -
【经典算法题】鸡蛋的硬度
【经典算法题】鸡蛋的硬度AcWing 1048. 鸡蛋的硬度问题描述问题链接:AcWing 1048. 鸡蛋的硬度分析本题使用DP解决,存在两种解法。解法一考虑初始化:f[i][1]=i, f[1][j]=1。时间复杂度:O(n2×m)O(n ^ 2 \times m)O(n2×m) 。解法二可以反着想,现在总高度是f[i - 1][j - 1] + f[i - 1][j] + 1,然后在中间扔一次鸡蛋,如果没碎,那就递归到上半部分的情况继续操作原创 2021-12-10 20:27:07 · 887 阅读 · 0 评论 -
【经典算法题】水壶问题
【经典算法题】水壶问题Leetcode 0365 水壶问题题目描述:Leetcode 0365 水壶问题分析本题的考点:数学、欧几里得算法。两个水壶记为A、B。A、B这两个水壶都是及不空也不满,这种情况是不可能存在的。这是因为我们的三种操作所决定的。我们考虑将两个水壶看成一体,考虑整个整体和外界交换的水量,在最优操作情况下(即操作次数最少的情况下),每次和外界交换的水量只可能是+x、-x、+y、-y。原因如下:假设现在A中有水但是不满,则B中要么是空要么是满,此时将A加满或原创 2021-12-10 15:52:06 · 2051 阅读 · 0 评论 -
【经典算法题】LRU缓存机制
【经典算法题】LRU缓存机制Leetcode 0146 LRU缓存机制题目描述:Leetcode 0146 LRU缓存机制分析本题的考点:哈希表、双向链表。Java中可以直接使用LinkedHashMap就可以。初始化一个双向链表,双向链表中的节点中存储键、值、左指针、右指针;新建虚拟头结点L和虚拟尾结点R,让其相互指向。对于get函数:如果不存在直接返回-1;如果存在通过哈希表以及键找到这个节点p,并将其移到头结点(先让p从链表中删除,然后再将p插入到虚拟头结点后面原创 2021-12-09 22:11:14 · 539 阅读 · 0 评论 -
【经典算法题】N皇后
【经典算法题】N皇后Leetcode 0051 N皇后题目描述:Leetcode 0051 N皇后分析本题的考点:递归回溯。递归过程中我们依次枚举每行,然后看这一行中皇后可以放置在哪个位置。对于当前枚举的某行u,如果判断该行中的第i列是否可以放置一个皇后呢?可以使用三个数组col、dg、udg表示列、左上到右下斜线、右上到左下斜线中是否放置了皇后。坐标转化关系如下:代码C++class Solution {public: int n;原创 2021-12-07 19:14:23 · 1518 阅读 · 0 评论 -
【经典算法题】查找和最小的K对数字
【经典算法题】查找和最小的K对数字Leetcode 0373 查找和最小的K对数字题目描述:Leetcode 0373 查找和最小的K对数字分析本题的考点:多路归并、堆。本题一共有n×mn \times mn×m对数据,将数组nums1、nums2分别记为a、b,按照数组b可以将这些数据分为m路,且每一路都是升序的,如下图:使用小根堆求解前k小的数据即可。代码C++typedef vector<int> VI; // (a[i] + b[j原创 2021-12-05 14:22:55 · 897 阅读 · 0 评论 -
【经典算法题】Pow(x, n)
【经典算法题】Pow(x, n)Leetcode 0050 Pow(x, n)题目描述:Leetcode 0050 Pow(x, n)分析本题的考点:快速幂。关于快速幂的讲解可以参考:快速幂。如果n是正数,可以直接使用快速幂;如果n是负数的话,我们可以对n取绝对值变成正数,然后快速幂,最后结果取个倒数即可。这里需要使用long long,因为当n=-2147483648时取绝对值会溢出,溢出后的值仍然是-2147483648,因此相当于abs(INT_MIN)==IN原创 2021-12-05 10:11:05 · 1273 阅读 · 0 评论 -
【经典算法题】反转链表
【经典算法题】反转链表Leetcode 0206 反转链表题目描述:Leetcode 0206 反转链表分析本题的考点:链表。本题十分经典,有两种解法,一种是非递归解法(用C++实现),另一种是递归解法(用Java实现)。非递归解法,每次维护两个指针a、b,让b->next=a,然后a、b都向后移动一个位置,为了让a、b向后移动,需要使用一个变量c缓存b->next。当b==NULL时结束循环,最后让head->next=NULL然后返回a即可。如下图:原创 2021-12-04 13:50:04 · 209 阅读 · 0 评论 -
【经典算法题】最大子序和
【经典算法题】最大子序和Leetcode 0053 最大子序和题目描述:Leetcode 0053 最大子序和分析本题的考点:动态规划、分治。动态规划考虑状态表示f[i]:表示以nums[i]结尾的最大的连续子数组和。考虑状态转移:f[i]=max(f[i−1],0)+nums[i],0<i<nf[i] = max(f[i- 1], 0) + nums[i], 0 < i < nf[i]=max(f[i−1],0)+nums[i],0<i&l原创 2021-12-03 09:58:10 · 223 阅读 · 0 评论 -
【经典算法题】用队列实现栈
【经典算法题】用队列实现栈Leetcode 0225 用队列实现栈题目描述:Leetcode 0225 用队列实现栈分析本题的考点:设计。使用两个队列q, w,q用于存储元素,w是缓存队列。每次插入元素时,向q中插入元素;删除栈顶元素时,可以先将队列中前q.size()-1个元素存储到缓存队列w中,最后将q中剩余的一个元素缓存到临时变量t中,然后删除q中最后一个元素,最后将w中的元素再次放入q中即可;返回栈顶元素的操作和删除类似;栈是否为空只需要看q是否为原创 2021-12-02 10:07:50 · 650 阅读 · 0 评论 -
【经典算法题】用栈实现队列
【经典算法题】用栈实现队列Leetcode 0232 用栈实现队列题目描述:Leetcode 0232 用栈实现队列分析本题的考点:设计。可以使用两个栈stk1、stk2实现队列,stk1用于存储元素,stk2是缓存栈。每次插入元素时,向stk1中插入元素;删除队首元素时,可以先将栈顶的stk1.size()-1个元素存储到缓存栈stk2中,最后将stk1中剩余的一个元素缓存到临时变量t中,然后删除stk1中最后一个元素,最后将stk2中的元素再次放入stk1中即可;原创 2021-12-02 09:57:03 · 838 阅读 · 0 评论 -
【经典算法题】排列序列
【经典算法题】排列序列Leetcode 0060 排列序列题目描述:Leetcode 0060 排列序列分析本题的考点:数学。对于c++而言,可以使用next_permutation,计算量为n!×nn! \times nn!×n,最大为9!×9=3,265,9209! \times 9 = 3,265,9209!×9=3,265,920,可以通过,考试肯定用这种做法。下面讲解另一种做法:计数法。对于n,我们要求第k大的小的数,我们可以依次考虑1~n这些位置应该放入哪原创 2021-12-02 09:24:10 · 1970 阅读 · 0 评论 -
【经典算法题】下一个排列
【经典算法题】下一个排列Leetcode 0031 下一个排列题目描述:Leetcode 0031 下一个排列分析本题的考点:数组。本题考察的是c++中next_permutation的实现。思路是:寻找最后一个严格上升对的前一个元素e,然后寻找e后面大于e的最小的元素x,交换e和x,然后将最后的下降序列翻转即可,如下图:代码C++class Solution {public: void nextPermutation(vector<in原创 2021-12-01 09:53:46 · 912 阅读 · 0 评论 -
【经典算法题】根据身高重建队列
【经典算法题】根据身高重建队列Leetcode 0406 根据身高重建队列问题描述:Leetcode 0406 根据身高重建队列分析这一题存在两种做法。方法10~n-1,一共n个位置,我们需要考虑每个人放在哪个位置。将people按照第一维升序、第二维降序的顺序排序,然后依次从前往后考虑每一个二元组。假设当前考察的是第i个二元组(h,k)(h, k)(h,k),首先让k++,说明这个人身高是第k大的。假设第i个二元组的身高严格大于第i-1个二元组的身高,则我们原创 2021-11-30 11:24:54 · 353 阅读 · 0 评论 -
【经典算法题】无重复字符的最长子串
【经典算法题】无重复字符的最长子串Leetcode 0003 无重复字符的最长子串题目描述:Leetcode 0003 无重复字符的最长子串分析本题的考点:双指针、哈希表。本题中使用到双指针的技巧,具体来说是双指针中的滑动窗口技巧;双指针中还包括对撞指针技巧。我们使用[j, i]表示当前没有重复字符的窗口大小,如果当前考察的字符和窗口中的字符重复了,则让j不断后移直到没有重复字符即可。还有一个问题,我们如何判断当前考察的字符和窗口[j, i]中的字符重复了?可以使用哈原创 2021-11-29 14:28:25 · 1137 阅读 · 0 评论 -
【经典算法题】正则表达式匹配
【经典算法题】正则表达式匹配Leetcode 0010 正则表达式匹配题目描述:Leetcode 0010 正则表达式匹配分析本题的考点:动态规划。分析如下:代码C++class Solution {public: bool isMatch(string s, string p) { int n = s.size(), m = p.size(); s = ' ' + s, p = ' ' + p;原创 2021-11-28 20:31:20 · 3079 阅读 · 0 评论 -
【经典算法题】接雨水
【经典算法题】接雨水Leetcode 0042 接雨水题目描述:Leetcode 0042 接雨水分析本题的考点:数组。核心思路:我们求出每个位置能存储的水量,最后加到一起就可以得到答案,如下图五个地方的水量相加即可:那么如何求解每个位置可以存放的雨水?我们可以预先处理处两个数组left_max和right_max。left_max[i]表示height[0]~height[i]中最高的柱子,right_max[i]表示height[i]~height[n-1]中最高原创 2021-11-27 11:33:21 · 7031 阅读 · 0 评论 -
【经典算法题】二叉树的序列化与反序列化
【经典算法题】二叉树的序列化与反序列化序列化:将数据结构转化成数据流的形式,方便网络传输;反序列化:从数据流中恢复原始的数据结构。Leetcode 0297 二叉树的序列化与反序列化题目描述:Leetcode 0297 二叉树的序列化与反序列化分析本题的考点:二叉树。本题相当于将一棵树变成一个字符串,然后再将这个字符串变成一棵树。这里提供的解法是基于二叉树的先序遍历,当遇到空节点时,用#号表示,并且节点直接用,隔开。代码C++class Codec原创 2021-11-26 16:17:11 · 381 阅读 · 0 评论 -
【经典算法题】二叉树的最近公共祖先
【算法经典题】二叉树的最近公共祖先Leetcode 0235 二叉搜索树的最近公共祖先题目描述:Leetcode 0235 二叉搜索树的最近公共祖先分析本题的考点:LCA(最近公共祖先)。关于LCA问题可以参考:网址。因为是二叉搜索树,所以我们可以根据值的大小递归求解。如果两个节点的值都小于根节点的值,则进入左子树搜索;否则若两个节点的值都大于根节点的值,则进入右子树搜索;否则当前根节点就是LCA。代码C++class Solution {public:原创 2021-11-26 14:49:27 · 932 阅读 · 0 评论 -
【经典算法题】滑动窗口最大值
【经典算法题】滑动窗口最大值Leetcode 0239 滑动窗口最大值题目描述:Leetcode 0239 滑动窗口最大值分析本题的考点:单调队列。本题是一个十分经典的题目。关于单调队列的讲解可以参考:网址。注意这里使用的双端队列,因为两端都要弹出元素。队列中存储的是元素对应的下标,这是因为我们要判断队首元素是否滑出滑窗,假设当前遍历到第i个元素,队首为q[hh],如果i - q[hh] + 1 > k,说明队首元素已经滑出滑窗,需要弹出队首元素。求区间最原创 2021-11-26 15:23:05 · 425 阅读 · 0 评论 -
【经典算法题】数据流的中位数
【经典算法题】数据流的中位数Leetcode 0295 数据流的中位数题目描述:Leetcode 0295 数据流的中位数分析本题的考点:对顶堆。本题考察数据结构:对顶堆。如下图:当我们调用findMedian()时,根据up.size()+down.size()的奇偶性返回对应的结果,如果为奇数,则返回down的堆顶元素,否则返回up和down堆顶元素的平均值。当我们调用addNum(x)函数时(1)如果down为空或者x小于等于down堆顶元素时,向down中插入原创 2021-11-26 10:49:18 · 233 阅读 · 0 评论 -
【经典算法题】相交链表
【经典算法题】相交链表Leetcode 0160 相交链表题目描述:Leetcode 0160 相交链表分析本题的考点:双指针。开始让指针p、q分别指向headA、headB,p、q每次都向后走一个位置,当走到空节点时,让其等于另一个链表的头指针,这样当p、q一定会相遇。相遇分为两种情况,一种是headA、headB有交点,相遇点就是相交的起点,如下图:当headA、headB没有交点时,最终p、q都会称为NULL节点。代码C++class Sol原创 2021-11-26 09:44:11 · 92 阅读 · 0 评论 -
【经典算法题】环形链表
【经典算法题】环形链表Leetcode 0141 环形链表题目描述:Leetcode 0141 环形链表分析本题的考点:快慢指针。使用双指针s、f,s表示慢指针,每次向后移动一个位置,f表示快指针,每次向后移动两个位置。如果存在环的话,则两个指针一定会相遇;否则不存在环。代码C++class Solution {public: bool hasCycle(ListNode *head) { if (!head || !head->原创 2021-11-26 09:39:09 · 94 阅读 · 0 评论 -
【经典算法题】颜色分类
【算法经典题】颜色分类Leetcode 0075 颜色分类题目描述:Leetcode 0075 颜色分类分析本题的考点:三路快排。本题需要使用三个指针i、j、k,初始i=0, j=0, k=nums.size()-1;其中[0, j-1]存储0,[j, i-1]存储1,[k+1, nums.size()-1]存储2,刚开始三个区间都为空区间,满足定义。具体分为三种情况,如下图:代码C++class Solution {public: void原创 2021-11-26 09:25:51 · 911 阅读 · 0 评论 -
【经典算法题】数字1的个数
【经典算法题】数字1的个数1. 典型例题AcWing 338. 计数问题问题描述问题链接:AcWing 338. 计数问题分析考点:数位DP。考点详解网址:【动态规划】数位统计DP。这一题首先需要转化一下,让我们求区间[a, b]之间各个数字出现的次数,利用前缀和的思想,假设count(n, i), 0<=i<=9可以求出1~n中i出现的次数,则最终i在[a, b]中出现的次数为count(b, i) - count(a - 1, i)。下面的问题就转化原创 2021-11-25 10:46:29 · 825 阅读 · 0 评论 -
【经典算法题】第K大数
【经典算法题】第K大数Leetcode 0215 数组中的第K个最大元素题目描述:Leetcode 0215 数组中的第K个最大元素分析本题的考点:快排、堆。快排首先因为k是从1开始的,但是数组从下标0开始,因此第1大的数据在排序后的数组中的nums[0]的位置,所以我们要将k--。每次快排会根据分界点x的值将数据分为两部分,即[l, j]、[j + 1, r](这种情况x不能取右边界,否则死循环)或者[l, i - 1]、[i, r]这种情况x不能取左边界,否则死循环)原创 2021-11-25 10:35:29 · 506 阅读 · 0 评论 -
【经典算法题】可怜的小猪
【经典算法题】可怜的小猪Leetcode 0458 可怜的小猪题目描述:Leetcode 0458 可怜的小猪分析本题的考点:数学。使用n、m、p来代表题目中的buckets、minutesToDie、minutesToTest。则我们最多进行k=⌊pm⌋k = \lfloor \frac{p}{m} \rfloork=⌊mp⌋轮测试。首先考虑一个简单情况,如果k=1,相当于我们只能进行一轮测试,则我们需要将猪看成二进制猪,将某桶水的编号转化为二进制,二进制下如果第i位是原创 2021-11-25 10:21:24 · 436 阅读 · 0 评论 -
【经典算法题】合并K个有序链表
【经典算法题】合并K个有序链表Leetcode 0023 合并K个有序链表问题描述问题链接:Leetcode 0023 合并K个有序链表解法一分析考点:归并排序。类似于归并排序,如下图,这里使用自底向上归并排序,每一行代表当前还剩余多少链表没有被合并,当最终合并成一个链表时,就是答案。这里合并两个链表会用到:Leetcode 0021 合并两个有序链表。代码C++// 自底向上归并排序class Solution {public: List原创 2021-11-24 10:54:28 · 1535 阅读 · 0 评论 -
【经典算法题】最长回文子串
【经典算法题】最长回文子串Leetcode 0005 最长回文子串问题描述问题链接:Leetcode 0005 最长回文子串解法一分析考点:中心扩散法。我们依次枚举字符串中的每个字母s[i],然后让s[i]或者(s[i], s[i+1])为中心,向两边扩展,得到以该中心为回文串的大小,记录长度最大的回文串的起点和长度。代码C++class Solution {public: string longestPalindrome(string s)原创 2021-11-24 10:40:06 · 1184 阅读 · 0 评论 -
【经典算法题】寻找两个正序数组的中位数
【经典算法题】寻找两个正序数组的中位数Leetcode 0004 寻找两个正序数组的中位数题目描述:Leetcode 0004 寻找两个正序数组的中位数分析本题的考点:二分。这里将nums1、nums2分别记为A、B。对于给定的数组A、B,我们要找到这两个数组中的中位数,我们考虑一个更加一般的问题,如何找到第k小的数据。假设我们需要找到A[i...]和B[j...]这两个数组的第k小的数据,则我们可以比较 A[i+⌊k2⌋−1]A[i+\lfloor \frac{k}{2}原创 2021-11-24 10:26:34 · 1322 阅读 · 0 评论 -
【经典算法题】一个简单的整数问题2
【经典算法题】一个简单的整数问题2AcWing 243. 一个简单的整数问题2问题描述问题链接:AcWing 243. 一个简单的整数问题2解法一分析考点:树状数组。考点详解网址:树状数组。对于最原始的树状数组存在两个操作:单点加,求区间和(即a[x]+=c, query[L~R]);AcWing 242. 一个简单的整数问题的操作正好反过来:区间加,求单点和(即a[L~R]+=c, query[x]);本题的操作更进一步:区间加,求区间和(即a[L~R]+=原创 2021-11-23 20:29:12 · 375 阅读 · 0 评论 -
【经典算法题】旋转字符串
【经典算法题】旋转字符串Leetcode 0796 旋转字符串题目描述:Leetcode 0796 旋转字符串做法一分析考点:最小表示法。考点详解网址:最小表示法。求出两个串的最小表示,比较是否相等即可。假设给定我们的字符串是s,首先我们将s复制一遍接到s的尾部,假设字符串长度为n,当我们枚举起点start在返回0~n-1时就可以得到所有字符串的表示。初始让i=0, j=1,比较s[i+k]、s[j+k],用k表示相对于i、j的偏移位置,如果相等的话让k++,直到比原创 2021-11-23 16:41:29 · 163 阅读 · 0 评论