LeetCode
文章平均质量分 78
详细讲解leetcode的题目
hyzhang_
每一个不曾起舞的日子都是对生命的辜负!!!
展开
-
LeetCode刷题(中等2)
LeetCode精选TOP面试题(中等2)原创 2022-01-09 18:16:35 · 5453 阅读 · 14 评论 -
LeetCode精选TOP面试题(中等篇)【出现率降序】
LeetCodeTOP面试题中前300道中等题目原创 2021-12-20 23:44:47 · 1558 阅读 · 6 评论 -
动态规划之背包DP
动态规划之背包DP文章目录动态规划之背包DP01背包问题分割等和子集(动规)(动规-空间优化)[1049. 最后一块石头的重量 II](https://leetcode-cn.com/problems/last-stone-weight-ii/)(动规)(动规-空间优化)目标和(递归)(记忆化搜素)(动规-加偏移量)(动规-转化为01背包问题)(动规-空间优化)一和零(动规-01背包-二维费用背包-朴素版)(动规-01背包-二维费用背包-空间优化)完全背包问题[零钱兑换 II](https://leetc原创 2021-10-17 10:57:18 · 235 阅读 · 4 评论 -
动态规划之双序列DP问题题集
动态规划之双序列DP问题文章目录动态规划之双序列DP问题最长公共子序列(动规)正则表达式匹配(动规)通配符匹配(动规)编辑距离(动规)不相交的线(动规-LCS)交错字符串(动规)(动规2)(动规空间优化)不同的子序列(动规)两个字符串的删除操作(动规)最长公共子数组(动规)(动规-空间优化)最短公共超序列(动规)最长公共子序列(动规)最长公共子序列问题是最经典的双序列的DP问题,因为涉及到两个序列共同的部分,所以使用二维的DP数组来表示,而公共子序列的可以在循环的内部判断。1.状态定义dp[原创 2021-09-22 16:25:16 · 325 阅读 · 3 评论 -
动态规划之线性DP题集
动态规划之线性DP文章目录动态规划之线性DP(一)LIS问题最长上升子序列(朴素动规)(二分+贪心+动规)最大子序和(动规)(贪心)最长连续递增序列(动规)(双指针)俄罗斯套娃信封问题(二维LIS问题动规)(一维LIS问题)(一维LIS问题+二分贪心优化)堆箱子(三维LIS问题动规)无重叠区间(动规)(贪心1)(贪心2)用最少数量的箭引爆气球(贪心)最长数对链(动规)(贪心)(贪心右端点sort)最长字符串链(动规)(二)前后缀数组除自身以外数组的乘积(动规)(动规空间优化)数组中的最长山脉(动规枚举山顶原创 2021-09-18 23:04:54 · 724 阅读 · 3 评论 -
dp路径专项练习
动态规划之路径DP路径dp的形式:指定了一个「起点」和一个「终点」,有一个「移动规则」答案在按照移动规则移动的过程中产生。文章目录动态规划之路径DP不同路径(动规)(组合数学)[不同路径 II](https://leetcode-cn.com/problems/unique-paths-ii/)(动规)最小路径和(动规)进阶问题三角形最小路径和(从下到上动规)(从上到下动规)(空间优化)下降路径最小和(从下到上动规)[下降路径最小和 II](https://leetcode-cn.com/proble原创 2021-09-07 19:56:30 · 254 阅读 · 0 评论 -
贪心算法进阶练习
贪心算法核心思想:使用目光短浅的方法也可以完成任务。只需要解决每个阶段的某一个子问题即可。注意:贪心的套路就在于没有套路。文章目录贪心算法①凭直觉猜贪心的公式买卖股票的最佳时机 II(贪心)(动规)(动规一维空间优化)数组拆分 I(贪心)②贪心和动规的区别分发糖果(贪心)(贪心)最大子序和(动规)(贪心)摆动序列(动规)(动规优化空间)(贪心)(贪心2)③区间调度问题无重叠区间(贪心1左端点排序)(贪心2右端点排序)用最少数量的箭引爆气球(贪心1左端点排序)(贪心2右端点排序)[会议室 II](htt原创 2021-08-31 15:15:47 · 446 阅读 · 7 评论 -
双指针进阶算法练习
双指针算法前言:滑动窗口算法中经常会使用到双指针算法。如果想了解滑动窗口的练习的话,可以点这里。文章目录双指针算法两数之和ll - 输入有序数组(二分)(双指针)三数之和(暴力递归)TLE(排序+双指针)最接近的三数之和(排序+双指针)接雨水(暴力解法)TLE(以空间换时间优化-动态规划)(双指针)(单调栈)盛最多水的容器(暴力)TLE(双指针+贪心)双指针核心思想:当数组或者字符串中的子数组或者子串具有一定的单调性的时候,可以使用双指针避免重复的计算。两数之和ll - 输入有序数组(二分原创 2021-08-26 17:26:55 · 132 阅读 · 0 评论 -
并查集的实现与练习
并查集文章目录并查集一种实现+两种优化Quick Union并查集之加边练习省份数量(并查集)(深度优先搜索)(广度优先搜索)冗余连接(并查集)连通网络的操作次数(并查集)并查集之与数字建立联系等式方程的可满足性(并查集)最长连续序列(暴力+哈希)(哈希表)(排序)(并查集)按公因数计算最大组件大小(并查集)并查集之连通块问题岛屿数量(深搜)(广搜)(并查集)被包围的区域(递归爆搜)(深搜简化版)(广搜简化版)(并查集)由斜杠划分区域(数组转换 + 深搜连通块)(转化思想 + 并查集)使用条件:当关于原创 2021-08-26 16:22:58 · 144 阅读 · 2 评论 -
滑动窗口算法练习
滑动窗口算法文章目录滑动窗口算法双指针模板滑动窗口在原串中寻找目标子串无重复字符的最长子串(哈希表+双指针->滑动窗口)(优化滑动窗口)*最小覆盖子串(滑动窗口)长度最小的子数组(暴力循环累加)TLE(前缀和+二分)(滑动窗口)找到字符串中所有字母异位词(滑动窗口)字符串的排列(滑动窗口)在替换过后的字符串中寻找目标子串*替换后的最长重复字符(滑动窗口)最大连续1的个数 lll(暴力)(二分+前缀和)(滑动窗口)尽可能使字符串相等(前缀和+二分)(滑动窗口)删除一个元素以后全为1的最长子数组(二分+原创 2021-08-21 21:22:23 · 436 阅读 · 4 评论 -
栈和队列进阶练习
文章目录栈简化路径问题(经典一)简化路径(stringstream + getline忽略‘/’)有效括号(栈)(哈希表+栈)逆波兰表达式(栈)取出重复字母保留字典序最小问题(经典二)去除重复字母(单调栈+贪心+哈希表)单调栈(经典三)接雨水(单调栈)(双指针)(暴力)TLE(动规优化暴力)每日温度(暴力)(单调递增栈)(dp思想)下一个更大元素 l(暴力 + 哈希表)(单调栈 + 哈希表)(单调栈【逆向遍历】 + 哈希表)下一个更大元素 ll(单调栈 + 暴力)(单调栈 + 循环数组)柱状图中最大的矩形(原创 2021-08-20 16:13:11 · 185 阅读 · 1 评论 -
排序算法配套leetcode练习
排序算法冒泡排序把数组排成最小的数(贪心)class Solution {public: string minNumber(vector<int>& nums) { sort(nums.begin(), nums.end(), [](int a, int b) { string t1 = to_string(a); string t2 = to_string(b); return t原创 2021-08-11 15:53:53 · 311 阅读 · 0 评论 -
二分查找【模板+使用题型+练习】
文章目录二分模板模板1模板2模板3使用二分的时机二分下标系列搜索插入位置二分在排序数组中查找元素的第一个和最后一个位置(二分)寻找旋转排序数组中的最小值(二分)寻找旋转排序数组中的最小值Ⅱ(二分)搜索旋转排序数组(朴素二分)(粗糙二分)搜索旋转排序数组 ll(二分)(粗糙二分)第一个错误版本(二分)(二分)山脉数组的峰顶索引(暴力)(二分)(二分)(三分)山脉数组中查找目标值(二分)(三分找峰值+二分找target)二分答案系列x的平方根(二分)数的三次方根(浮点数二分)寻找重复数(暴力)(哈希映射)(排序原创 2021-08-02 18:05:23 · 595 阅读 · 2 评论 -
动态规划之子序列问题(子串,子序列,编辑距离,回文串)
动态规划(子序列问题)文章目录动态规划(子序列问题)子序列(不连续)最长上升子序列(暴力回溯)(动规)(动规 + 二分 + 贪心)(动规 + 二分 + 贪心)化简版最长公共子序列(动规)不相交的线(动规)子序列(连续)最长连续上升子序列(动规)(双指针)最长公共子数组 (动规)(动规 一维数组优化)(滑动窗口 待更新)最大子序和(暴力)(动规)(动规 空间优化)(贪心)总结(连续和不连续问题)连续子序列分析方法:(复盘连续子序列)不连续子序列分析方法:(复盘不连续子序列)编辑距离判断子序列(双指针)(动原创 2021-07-21 18:08:39 · 212 阅读 · 0 评论 -
最长上升子序列/子串和最长公共子序列/子串
文章目录子序列(不连续)最长上升子序列(暴力回溯)(动规)(动规 + 二分 + 贪心)(动规 + 二分 + 贪心)化简版最长公共子序列(动规)(动规)子序列(连续)最长连续上升子序列(动规)(双指针)最长公共子数组 (动规)(动规 一维数组优化)(滑动窗口 待更新)子序列(不连续)<span id = “最长上升子序列">最长上升子序列LIS(longest increasing subsequence)是最经典的动态规划题目之一,因为它的递推公式很有条理,可以很清楚的告诉我们什么状态可以原创 2021-07-17 22:12:00 · 910 阅读 · 1 评论 -
动态规划从递归到动规之打家劫舍
动态规划(打家劫舍)文章目录动态规划(打家劫舍)打家劫舍系列打家劫舍(递归)TLE(记忆化搜索)(动规1)(动规2)(动规 空间优化)打家劫舍Ⅱ(记忆化搜索)(动规1)(动规2)(动规 空间优化)打家劫舍Ⅲ(暴力递归)(记忆化搜索)(树形dp)打家劫舍系列如果想看背包问题的讲解和练习的同学可以点这里打家劫舍不管怎么样,先用暴搜递归出一个答案,后面再去优化时间复杂度。定义一个递归函数表示前start个房间偷,可以获得的最大金额数。因为每一次不可以回头偷已经投过的房间,所以要设置start这个变量,原创 2021-07-14 17:13:55 · 187 阅读 · 0 评论 -
01背包和完全背包练习与讲解
背包问题的模板背包问题的模板常见的背包类型主要有以下几种:1.0/1背包问题:每个元素最多选取一次一维数组优化:外循环物品,内循环背包,内循环倒序。2.全背包问题:每个元素可以重复选择一维数组优化:外循环物品,内循环背包,内循环正序。完全背包的组合和排列:当计算组合的时候:外循环物品,内循环背包当计算排列的时候:外循环背包,内循环物品。而每个背包问题要求的也是不同的,按照所求问题分类,又可以分为以下几种:1.最值问题:要求最大值/最小值 -》dp[j] = max(dp[j], d.原创 2021-07-13 18:47:09 · 416 阅读 · 0 评论 -
背包问题(从递归回溯到动态规划)(01背包和完全背包)
动态规划方法论1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组背包问题的模板背包问题分类:常见的背包类型主要有以下几种:1、0/1背包问题:每个元素最多选取一次2、完全背包问题:每个元素可以重复选择3、组合背包问题:背包中的物品要考虑顺序4、分组背包问题:不止一个背包,需要遍历每个背包而每个背包问题要求的也是不同的,按照所求问题分类,又可以分为以下几种:1、最值问题:要求最大值/最小值 -》dp[j] = max(dp[j原创 2021-07-13 07:17:31 · 900 阅读 · 1 评论 -
回溯算法专题练习
回溯算法vector<vector<T>> res;vector<T> path;void backtrack(未探索区域, res, path): if 未探索区域满足结束条件: res.push_back(path) return; for 选择 未探索区域当前可能的选择: if 当前选择符合要求: path.push_back(当前选择) back原创 2021-06-26 09:34:43 · 1011 阅读 · 0 评论 -
LeetBook哈希表专题题解(详解/一题多解)
哈希表文章目录哈希表设计哈希表设计哈希集合(set)(超大数组法)(拉链法1(list实现))(拉链法2(模拟实现单链表+虚拟头节点))(拉链法3(模拟单链表不叫虚拟头节点))设计哈希映射(超大数组法)(拉链法1 vector+list+pair)(拉链法2 vector+ListNode*)(拉链法3 vector + ListNode*)(面试写拉链法)(带有虚拟头结点的拉链法)(开放寻址法)实际应用-哈希集合存在重复元素(multiset)(set1)(set2)(sort)只出现一次的数字(异或)原创 2021-06-19 11:14:47 · 1021 阅读 · 0 评论 -
LeetBook链表专题题解
链表单链表 设计单链表 注意:中间删除结点和中间插入结点都不难,但是任意插入或删除结点的时候需要考虑到头插或头删。要注意的是如果头结点改变了,那head结点就要改变,所以当插入结点或者删除结点的时候需要特别小心头结点的插入删除。class MyLinkedList {private: struct ListNode { int val; ListNode* next; ListNode(int v = 0) :val(v), next(nullptr) {} }; int原创 2021-06-11 14:53:48 · 156 阅读 · 1 评论 -
LeetBook数组和字符串专题题解
数组和字符串文章目录数组和字符串数组入门寻找数组的中心索引(暴力解法(不能AC))(前缀和)(左右和)(前缀和不用数组)搜索插入位置(二分)合并区间二维数组》数组中数据的操作*旋转矩阵(对称旋转法1)(对称旋转法2)(旋转对称法3)零矩阵(额外开空间记录点坐标)(不开额外空间,原地修改)》二维数组的不同的遍历方式*对角线遍历(正负对角线)(整合优化版)螺旋矩阵(方向打表)字符串最长公共前缀最长回文子串(暴力枚举)(中心扩展法)(动态规划)反转字符串中的单词(双指针)(容器存储)(原地删除法)Strstr(原创 2021-06-06 21:40:50 · 215 阅读 · 0 评论 -
LeetCode队列和栈专项练习(题解)
栈和队列初识队列设计循环队列class MyCircularQueue {private: int head; int tail; int capacity; vector<int> a;public: MyCircularQueue(int k) { head = -1; tail = -1; capacity = k; a.resize(k); } bo原创 2021-05-23 17:02:14 · 228 阅读 · 0 评论 -
LeetCode179最大数LeetCode402移掉位数字
哈哈原创 2021-04-12 22:48:20 · 102 阅读 · 0 评论 -
LeetCode263丑数 LeetCode264丑数二
263. 丑数只要把num中的2, 3, 5除干净即可class Solution {public: bool isUgly(int n) { if (n <= 0) return false; while (n % 2 == 0) n /= 2; while (n % 3 == 0) n /= 3; while (n % 5 == 0) n /= 5; return n == 1; }};26原创 2021-04-11 19:29:25 · 110 阅读 · 0 评论 -
leetcode剑指 Offer 25合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->40 <= 链表长度 <= 1000/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n原创 2021-04-10 23:21:19 · 91 阅读 · 0 评论 -
删除排序链表中的重复元素 II(删除全部重复结点)
删除排序链表中的重复元素 II 试试这题给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3整体思路:这题特别容易错,因为可能会考虑不周全,但是大体思想就是用三个指针,prev,cur,next遍历整个链表,如果cur和next的val相原创 2021-02-08 20:39:59 · 576 阅读 · 0 评论 -
16.链表的插入排序(链表头插+中间插入+尾部插入)
对链表进行插入排序 试试这题插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5整体原创 2021-02-08 18:13:54 · 600 阅读 · 0 评论 -
复杂链表的复制(带有随机指针的结点的复制)(插图解释)
剑指 Offer 35. 复杂链表的复制 试试这题请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]示例 2:输入:head = [[1,1],[2,1]]输出:[原创 2021-02-08 15:59:33 · 188 阅读 · 0 评论 -
13.环形链表Ⅰ(双指针)14.环形链表Ⅱ(双指针)(有公式推导哦)
环形链表 试试这题给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释原创 2021-02-07 20:28:21 · 194 阅读 · 0 评论 -
12.相交链表(返回两个链表的第一个公共结点)
相交链表 试试这题编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链原创 2021-02-07 18:04:30 · 132 阅读 · 0 评论 -
11.回文链表(两种方法)(双指针+头插)
面试题 02.06. 回文链表 试试这题编写一个函数,检查输入的链表是否是回文的示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true思路:首先要得到链表的一半,然后将前半部分或后半部分的链表逆置,然后和前面的另一半比对,若相同则是回文的,反之则不是,细节请看代码第一种方法:找中间结点+头插逆置先求出结点总个数然后即可以找到中间位置,这样效率不高,但是可以把链表的结构掌握的很清楚/** * Defini原创 2021-02-07 17:22:30 · 142 阅读 · 0 评论 -
10.链表分割((尾插法)程序员面试宝典)(力扣)
题目描述现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。主要思路:利用尾插法,开辟两个新的链表,分别将<x和>=x的结点分成两份,然后再将两个链表相连,最后返回第一个链表的头指针就完成了,(在开辟两个新的链表的时候,我们可以开辟两个哨兵位的结点,这样会更方便尾插,最后返回第一个链表的第二个结点就可以了)struct ListNode { int val; struc原创 2021-02-07 16:06:43 · 166 阅读 · 1 评论 -
合并两个有序链表(尾插法)(哨兵结点)(面试题热题)
合并两个有序链表想练练手这题可以点这里题目要求:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]还是先讲讲解题的思路:这题我主要使用了尾插法,就是创建一个新的链表的头,然后每次都取出两个链表中最小的那一个结点然后接在新的链表的后面,直到链表的结束,虽然思路只有这么多,但是这题要注意的细节还是挺多的,我会在代码的注释里解释/** * Defini原创 2021-02-06 21:53:32 · 269 阅读 · 0 评论 -
反转单链表(三种方法)(三指针法)(头插法)(递归)经典面试题
剑指 Offer 24. 反转链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL三指针法/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; *原创 2021-02-04 22:42:09 · 1326 阅读 · 1 评论 -
双指针(快慢指针)以题为例讲解,链表的中间节点,链表的倒数第k个结点
链表的中间结点给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.原创 2021-02-06 21:10:14 · 130 阅读 · 0 评论 -
原地删除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。int removeElement(int* nums, int numsSize, int val){ int k = 0; for(int i = 0; i < numsSize; i++) { if原创 2021-01-30 23:15:54 · 466 阅读 · 0 评论 -
怎样在数组中去掉重复的数字(消失的数字,数组中数字出现的次数)(力扣)
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?int missingNumber(int* nums, int numsSize){ int num = 0; for(int i = 0; i < numsSize; i++) { num = num ^ i; num = num ^ nums[i]; } num ^= numsSize; return原创 2021-01-30 22:58:07 · 574 阅读 · 1 评论