leetcode
文章平均质量分 66
记录
qq_37357873
这个作者很懒,什么都没留下…
展开
-
滑动窗口问题合集
leetcode+labuladong滑动窗口要先确定,哪一个窗口固定(枚举哪个,哪一个固定),哪一个窗口滑动一个是包含T的排列,一个是包含T所有字母,其实是一个意思,唯一的区别是,在子串中T的排列是连续的,在子串中T字母之间可以不连续所有字母的实现,用一个unordered_map即可,也可以用数组unordered_map<char,int> need,window;//need[c]表示T中需要几个字符c,window[c]表示,目前窗口中有几个字符cint need[26];原创 2021-08-07 10:25:38 · 104 阅读 · 0 评论 -
动态规划-打家劫舍问题的思考
打家劫舍labuladong1.原始打家劫舍自底向上的解法中,对dp[i]的定义首先我想到的是dp[i] 表示 从当抢劫完前0~i个房子的时候能获得的最多的钱对打家劫舍系列第一题是可以得到解的,代码如下:for(int i=0;i<n;i++){ if(i==0) dp[i]=nums[i]; else if(i==1) dp[i]=max(nums[i-1],nums[i]); else{ dp[i]=max(dp[i-1],dp[i-2]原创 2021-08-07 10:24:12 · 127 阅读 · 0 评论 -
判断两个链表是否相交
原博客待整理原创 2021-08-07 10:23:58 · 94 阅读 · 0 评论 -
高楼扔鸡蛋-算法小抄笔记
labuladong高楼扔鸡蛋问题【理解题目】最坏情况下,至少扔几次鸡蛋,找到鸡蛋恰好不会碎的楼层最坏情况:不管用什么策略,鸡蛋破碎一定发生在穷举尽搜索空间的时候。比如总共7层楼,用线性搜索,从第一层开始往上,搜索到第七层鸡蛋碎,这就是最坏情况用二分搜索,鸡蛋在第七层破碎,需要扔第一次(1+7)/2=4,(5+7)/2=6, 7,三次才破碎,这就是二分的最坏情况至少几次:如果不限制鸡蛋的个数,那么二分就是最少的搜索次数(即使是最坏情况下最多是logn次)【先考虑只有两个鸡蛋的情况,在第i层扔第原创 2021-08-07 10:21:24 · 170 阅读 · 0 评论 -
贪心算法之跳跃游戏
【题目】问题一:能否跳到终点如何判断能否到终点?只要某个点x,满足x+nums[x]>=终点的index,那么就可以到达终点,同时需要满足x是可以到达的如何判断x是否能到达?同理,只要能到达某个点i,满足i+nums[i]>=x,那么x就是能到达的我们维护一个farthest,就是目前能到达的最远的点,表示从0-farthest的中间所有点都可以通过某种跳跃方式到达;遍历数组的过程中更新farthest当farthest>=终点index的时候,就说明能到终点当farthe原创 2020-11-25 20:17:36 · 185 阅读 · 0 评论 -
区间问题解法(贪心)
labuladong之贪心算法区间调度关于区间相关这类问题,基本思路都是排序,然后找交集或者找合集。首先要做的是讨论区间之间的包含情况,都画出图,决定是end还是start排序。文章目录1. 最多不相交区间【题目描述】终点排序起点和终点排序的不同之处起点排序【例题】2.区间选点【题目描述】终点排序起点排序3.区间覆盖【问题描述】起点排序1. 最多不相交区间【题目描述】n个开区间(ai,bi)(a_i,b_i)(ai,bi)。选择尽量多个区间,使得这些区间两两不相交。终点排序按照终点从小到原创 2020-11-25 10:16:23 · 294 阅读 · 0 评论 -
背包问题的整理
dp[i][j]:装前i个物品,背包的可装空间为j的情况下,问题的解(1)能装的最大价值(不一定要装满,只要价值最大)(2)恰好将背包装满的最大价值(3)恰好将背包装满有多少种装法01背包完全背包恰好将背包装满【问题】将硬币凑成指定面值,可以有多少种组合方式?硬币问题dp[i][j]表示使用前i种硬币,总面值为j的时候,最多有几种组合方式总面值=背包容积每种硬币面值=每种物品重量状态转移:不用第i种硬币+用第i种硬币dp[i][j]=dp[i-1][j]+dp[i][j-coin[i原创 2020-11-22 23:25:36 · 131 阅读 · 0 评论 -
BST二叉搜索树常见框架
中序遍历得有序数组判断是否二叉搜索树不能简单的用左子节点和右子节点比较而要用左子树的最大值和右子树的最小值与根节点比较现在限定根节点的取值范围min.val<=root.val<=max.val通过根节点,根节点能取到的最小值,根节点能取到的最大值进行判断bool isvalidBST(TreeNode *root,TreeNode *min,TreeNode *max){}那么当根节点的值超过限制,就说明不是BST//根节点小于最小值了if(min!=NULL&am原创 2020-11-16 22:42:28 · 66 阅读 · 0 评论 -
二叉树/二叉搜索树(BST)解题思路框架
文章目录二叉树解题框架思路如何确定用什么遍历二叉树各种遍历的框架层次遍历前序中序后续如何确定前序后续中序中的操作序列化和反序列化前序后续(特殊)层次序列化反序列化重复子树的例题二叉树解题框架思路首先要确定,这道题用什么遍历?一定能找到一种遍历模板解决这道题,所以一定要熟悉遍历模板先序/中序/后续=>用递归层次遍历=>while循环+队列如何确定用什么遍历思考一个节点需要做什么。如果是二叉搜索树,一般考虑中序遍历以为二叉搜索树中序遍历可以得到一个升序的数组如果想得到降序的数组就先原创 2020-11-16 18:23:13 · 226 阅读 · 0 评论 -
二叉树最近公共祖先LCA---解题过程问题分析
【比较容易理解的思路描述】相当于在root为根的树中找p,q,找到了就传给它的父节点(如果找到叶子结点还没找到,那就是不存在p/q,就把null往父节点上传),一层一层向上传,可以理解为://比如上面的例子,root[10]=4//传给4的父节点,root[4]结果有以下几种:(1)p,q传到某个节点root的左右子节点,那么root就是LCA(2)q传到某一层父节点的时候,这个父节点是p,那么p就是LCA(3)p传到某一层父节点的时候,这个父节点是q,那么q就是LCA(4)如果p||..原创 2020-11-14 22:33:41 · 95 阅读 · 0 评论 -
nsum问题(两数之和、三数之和、多数之和)
两数之和返回和为target的两数,不能重复eg: nums={1,1,3,3,5,2,2,4,6,8} target=5return [[1,4],[3,2]]或者是返回和为target的两数的索引方法一:哈希表时间复杂度O(n)O(n)O(n) 空间复杂度O(n)O(n)O(n)vector<vector<int> > 2sum(vector<int> nums,int target){ unordered_map<int,int>原创 2020-11-12 23:07:06 · 332 阅读 · 0 评论 -
三道区间问题的笔记
三道区间问题:常见的就是找找被覆盖的区间个数 区间之间的覆盖、交集等关系一般思路先对区间按照 起点升序(终点一般是降序)排列列出每一种区间之间的包含关系区间列表的交集怎么遍历两个列表?用两个指针两个指针什么时候后移?是否前进,只取决于 a2 和 b2 的大小关系:# pythonif b[1]<a[1] :b后移一个if a[1]<b[1] :a后移一个...原创 2020-11-12 20:30:18 · 169 阅读 · 0 评论 -
动态规划-股票买卖问题
labuladong股票买卖非模板(k=1只需一维数组)1.定义dp[i]dp[i]表示第i天所能获得的最大利润2.状态转移方程当price[i]<=price[i-1]时:dp[i]=dp[i-1]当price[i]>price[i-1]时:dp[i]=price[i]-min(price[0~i-1])这里如果要找min(price[0~i-1])可以for循环遍历,但是这样时间复杂度会变成$O(n^2),一个优化时间复杂度的方法是用一个变量min_price维护目前的最低股原创 2020-11-09 13:12:00 · 139 阅读 · 0 评论 -
二进制、位运算相关
移位运算运算符:左移<< ,右移>>移位运算可以作用于任意进制,只不过其实是将其转化成二进制进行操作的:int a=0xf,b=15;//a是16进制(转化成10进制就是15)int a1,b1;a1=a>>1;b1=b>>1;输出的结果a1和b1都是7右移一位相当于把这个数除2,左移一位相当于把这个数乘2&、||运算这两个运算,也是将数字转化成二进制实现的int a=9,b=8,c=0xf;int a1,b1;a1=a&原创 2020-11-07 12:47:39 · 136 阅读 · 0 评论 -
面试题-写代码
合并数组先写合并两个有序数组,接着写合并n个有序的数组,假设总共m个数解法:N个数组进行两两合并,合并后的数组再继续执行合并过程,最后合成NM的有序数组。可以认为合并这个递归过程发生了logN次,每一次合并的过程都是NM个数合并,所以每一次合并的时间复杂度为NM,总的时间复杂度就是NM*logNvector<int> num[maxn];//用vector<int> num[n]存储n个长度为m的数组,maxn>=n其实即可vector<int> res[原创 2020-11-07 10:44:26 · 164 阅读 · 0 评论 -
常见递归解决的问题--超出int的解可以求模
求有多少种解的问题,一般用递归能解记忆化递归只要能用递归解决的问题,都可以用记忆化递归用一个数组来存储已经计算出的结果,在递归函数的一开始处,先判断当前要求的值是否已经计算出来,如果计算出来,不用递归可以直接返回了动态规划能用递归的问题,一般都可以用动态规划解决青蛙跳台阶问题的递归边界n=0 return 1;这是为什么呢啊?从动态规划的角度看,dp[2]=dp[1]+dp[0]=2,所以dp[0]=1动态规划法:int dp[110];int numWays(int n){原创 2020-11-05 19:45:54 · 143 阅读 · 0 评论 -
dfs+回溯---存在问题:矩阵中的路径/拓扑排序
矩阵中的路径vector<vector<int> > vis;//记录是否访问过int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};int ok=0;bool dfs(vector<vector<char> >& board,int r,int c,int m,int n,string word,int index) //index标记是第几个字符{ bool res; if(index原创 2020-11-05 17:33:11 · 428 阅读 · 0 评论 -
C++哈希表
unordered_map的使用1、头文件:#include<unordered_map> 2、定义一个哈希表(我们以Key和Value都是int变量为例):unordered_map<int,int> Hash;3、哈希表的建立有下面几种方法:Hash[1]=3;Hash.insert<make_pair(1,3)>;Hash.insert({ {1,3},{2,4} });4、迭代器:unordered_map<int,int>:转载 2020-10-30 15:27:45 · 3047 阅读 · 0 评论 -
动态规划-子序列问题模板-题目延伸
1.一个一维数组dp[]最长上升子序列动态规划的时间复杂度O(n)O(n)O(n)二分查找:O(nlogn)O(nlogn)O(nlogn),纸牌问题:纸牌只能摞在比他大的纸牌上,如果当前没有堆可以放,就另起一堆,如果有多个堆都能放,就放在最左边的堆。有几堆纸牌最长上升子序列的长度就是几。变相等价于,用二分查找找左边界。if(a[mid]>=v) y=mid;else x=mid+1;2.一个二维数组dp[][]2.1涉及两个字符串最长公共子序列LCS2.2涉及一个字符串...原创 2020-10-28 21:34:28 · 155 阅读 · 0 评论 -
经典面试题-最长回文子串(双指针、dp)/子序列(dp)
回文串的的长度可能是奇数,也可能是偶数,这就添加了回文串问题的难度,解决该类问题的核心是双指针关于双指针的总结labuladong这道题如何使用双指针呢?寻找回文串的问题核心思想是:从中间开始向两边扩散来判断回文串for 0 <= i < len(s): 找到以 s[i] 为中心的回文串 找到以 s[i] 和 s[i+1] 为中心的回文串 更新答案动态规划也可以解决,时间复杂度一样,但是空间复杂度为O(n2)O(n^2)O(n2)存储dp[][]...原创 2020-10-28 18:13:40 · 407 阅读 · 0 评论 -
双指针技巧汇总
1.判定链表中是否含有环快指针走两步,慢指针走一步:快指针走到null,无环两个指针相遇,有环为什么有环二者一定会相遇?这里给出我的理解。以下图这个有环的链表为例,从“快指针和慢指针同时从链表的头结点出发”到“快指针最终和慢指针相遇”,这中间的过程可以分为两个阶段:“无聊的第1阶段:快指针、慢指针一起往前跑”和“精彩的第2阶段——快指针追慢指针”。在“无聊的第1阶段:快指针、慢指针一起往前跑”中,快指针和慢指针一起往前跑,每一次快指针往前跑两步、慢指针往前跑一步,直到快指针出现在慢指针的后原创 2020-10-21 20:30:02 · 160 阅读 · 0 评论 -
动态规划总结:题目类型-设计流程-框架
带备忘录的递归-自顶向下自顶向下主要是定义dp函数参数:状态返回值:要求的数值备忘录:memo[state],=初始化值,还未计算过;!=初始化值,状态state的结果值先初始化整个备忘录,用一个正常情况下结果取不到的值进行初始化整个备忘录,说明还没被计算过。例如结果都是大于零的数,则初始化为0;如果结果能取到零,就初始化为-1: memo(memo,-1,sizeof(memo))注意 如果用特殊值表示“还没计算过“,必须和其他特殊值区(比如无解)区分开。//这里是把结果数组和备忘录合在一起原创 2020-10-21 16:49:53 · 96 阅读 · 0 评论 -
动态规划-矩形嵌套问题(递归法实现)
矩形嵌套问题【题目描述】有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。如果有多解,矩形编号的字典序应尽量小。【分析】矩形之间的"可嵌套"关系是一个典型的二元关系,二元关系可以用图来建模。如果矩形X可以嵌套在原创 2020-10-21 10:55:01 · 1268 阅读 · 0 评论 -
分治法-归并/快排(递归)-二分(非递归)
这里写目录标题分治法1.最大连续和问题2.归并排序逆序对问题3.快速排序很多题目可以用暴力枚举法求解,比如1~n的全排列,可重复数字的全排列,8皇后问题等但是需要注意,当时间复杂度超过10910^9109一般就超时了,所以如果数量级为10510^5105及以上,时间复杂度为O(n)O(n)O(n)肯定就超时了,就考虑分治、贪心、动态规划等高级算法分治法分治法分成三个步骤,通常第三步是最难确定的: 划分问题 递归求解 合并问题同时注意定义递归的终止条件,例如对区间[x,y)[x,y原创 2020-10-20 10:39:26 · 201 阅读 · 0 评论 -
分治-递归实现-巨人与鬼
巨人和鬼一组n个巨人正与n个鬼进行战斗,每个巨人的武器是一个质子炮, 它可以把一串质子流射中鬼而把鬼消灭。质子流沿直线行进,在击中鬼时就终止。巨人决定采取下述策略。他们寻找鬼配对,以形成n个巨人─鬼对,。然后每个巨人同时向他选取的鬼射出一串质子流。我们知道,让质子流互相交叉是很危险的。因此巨人选择的配对方式应该使质子流都不会交叉。假定每个巨人和每个鬼的位置都是平面上的一个固定点,并且没有三个位置共线, 求一种配对方案。解题思路:由题意知,其必存在一个解,这里利用分治的思想,利用一条线,把原区域分为两个区原创 2020-10-19 15:53:46 · 104 阅读 · 0 评论 -
回溯法-八皇后问题 vs. 枚举法-1~n的全排列
下面的两个题都用到了递归的思想:将原问题分解,每次递归扩大解的规模,直到和原问题规模一致。注意一开始都是给出了递归终止条件,解的规模和原问题一和原问题一样了,递归就是终止了回溯法当用递归对问题求解时,如果当前步骤没有合法选择,则递归函数返回到上一级调用中,这种现象称为回溯八皇后问题递归求第cur行的皇后应该放在哪一列cur: 当前行c[ i ]: 第i行的皇后放在第几列tot: 解的个数void search(int cur,int n){ if(cur==n) tot++;//递原创 2020-10-19 10:32:16 · 291 阅读 · 0 评论 -
Broken Keyborad-链表实现
用结构体定义链表的一个节点typedef struct node{ node *next;//指向下一个节点 datatype data;//节点数据}创建头结点node *head; //head是指向头结点的指针head=(node*)malloc(sizeof(node));//这里参考 int *a;a=(int*)malloc(sizeof(int));//动态申请内存的固定用法,(类型*)是让得到的地址(指针)指向的是指定数据类型的空间if(head==NULL)原创 2020-10-12 16:39:59 · 87 阅读 · 0 评论 -
保研机试准备
一 零碎知识cin,cout速度会慢一点,如果输入#include<iostream> //C++标准输入输出,cin/cout#include<cstdlib>#include<cstdio> //c标准输入输出,scanf/printf#include<algorithm> //常用算法,比如快速排序sort函数#include<map><vector><string><set> //S原创 2020-10-11 21:16:03 · 303 阅读 · 0 评论 -
程序已停止工作的可能性
如果出现递归公式出错,无法达到递归的终止条件Eg:递归公式 return f(n)+1而不是return f(n-1)+1循环终止条件无法到达Eg:没有在循环体内令循环控制变量-1原创 2020-10-11 20:37:24 · 51 阅读 · 0 评论 -
#include<cctype>字符分类与转换函数
#include<cctype>经试验,只需包含#include<iostream>即可注意 这两个函数是处理字符的,而不能直接对字符串进行处理toupper(字符):将小写字母转化为大写字母tolower():将大写字母转化为小写字母...原创 2020-10-11 15:01:53 · 192 阅读 · 0 评论 -
溢出的可能性总结
溢出什么是整形溢出可能溢出的情况1.整数平方可能是由溢出造成的问题1.死循环什么是整形溢出int类型4byte,32位,符号位占一位,所以int类型的范围是−232-2^{32}−232(-2147483648)~2322^{32}232-1(2147483647)详细溢出介绍看这篇可能溢出的情况1.整数平方for(int i=2;i*i<n;i++)如果n是一个很接近int最大值的数,那么i*i有可能会在int类型范围内溢出,如果溢出成负数,那么程序就会死循环可能是由溢出造成的问题原创 2020-10-11 14:30:20 · 151 阅读 · 0 评论 -
跳出循环-M个苹果N个盘子
virtual judge1.函数跳出循环可用returnorigin:uva101 vector的使用如果是两(多)层for循环在里层(或中间某一层)中断跳出所有层的循环,这样的操作可以提出来,放到函数中,用return 实现中断跳出...原创 2020-10-11 14:30:02 · 109 阅读 · 0 评论 -
STL-queue-vector-map-set
五、STL5.1优先队列普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是原创 2020-10-11 08:47:40 · 136 阅读 · 0 评论 -
C/C++基础-书和笔记
文章目录零、常识0.1 时空复杂度边界0.2 动态申请内存0.3 ascll 码一、进位制与整数表示1.1进制输出1.2进制转换与位移1.3 int溢出二、C++字符串front和back取子串易搞错基础操作三、数组3.1 声明3.2 memset初始化3.3 字符数组读入基本操作零、常识0.1 时空复杂度边界时间:一般时间复杂度超过109,一定就超时了空间:int 类型 106就超过内存了0.2 动态申请内存尽量不用指针和动态申请内存。链表用c语言实现,申请内存空间用,#inc原创 2020-10-11 08:44:10 · 2359 阅读 · 0 评论 -
输入输出框架
输入输出 1.while(scanf(“%d%d”,&amp;n,&amp;q)==2&amp;&amp;n) 可以多次输入两个数字,然后执行循环中的操作,只有当输入0的时候跳出while循环 2.while(getline(cin,line))跳不出循环stlvector&lt;int&gt; pile[maxn] //每个pile[i]是一个vector...原创 2020-10-02 18:09:19 · 339 阅读 · 0 评论 -
upper_bound与lower_bound函数
头文件:#include <algorithm>二分查找的函数有 3 个:lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值第一个大于等于出现的位置。upper_bound(起始地址,结束地址,要查找的数值) 返回的是 第一个大于待查找数值 出现的位置。binary_search(起始地址,结束地址,要查找的数值) 返回的是是否存在这么一个数,是一个bool值。注意:使用二分查找的前提是数组有序。1 函数lower_bound()功能:函数lower_b原创 2020-10-21 10:00:40 · 324 阅读 · 0 评论 -
qsort函数(不能用c++STL时使用)
qsort包含在 stdlib.h头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。qsort函数声明如下: void qsort(void * base,size_t nmemb,size_t size ,int(compar)(const void ,const void *)); ...原创 2018-08-19 19:32:20 · 240 阅读 · 0 评论 -
kruscal(用到并查集)
#include&lt;iostream&gt;#include&lt;vector&gt;#include&lt;cstdlib&gt;#include&lt;cstdio&gt;#include&lt;algorithm&gt;using namespace std;#define maxn 850//最小生成树//定义边的结构原创 2018-09-11 15:31:21 · 88 阅读 · 0 评论 -
DFS/BFS-整理
DFS问题的类型 一般看到连通块就是用DFS,不同的是需要用连通块的什么信息如果问有多少个连通块?&lt;=&gt; 调用几次DFS,一般就是主函数里的dfs函数被调用的次数,在这个情况下,就需要对每个点属于哪个连通分量进行记录(用二维数组)如果问一个连通块有多少块?&lt;=&gt; 做完一遍DFS有多少点被标记,可以做完一次DFS就可以知道,在DFS函数中,对访问过的点标记(用二维数...原创 2018-09-11 20:50:44 · 251 阅读 · 1 评论 -
迪杰斯特拉--用了STL
N个点,T条双向边,输入: 点u编号 点v编号 距离定义带权图//定义边struct edge{ int to,dist;};vector&lt; edge &gt; G[maxn];//每个G[i]存放的是定点编号为i的点相邻的边添加边void add_edge(int u,int v,int dist){ edge e; e.to=v...原创 2018-09-09 19:12:44 · 203 阅读 · 0 评论