- 博客(37)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数组降维
地址:566. 重塑矩阵 - 力扣(LeetCode) (leetcode-cn.com)该题的解法为:以一维数组作为中间商,经一维数组的手把m行n列的数组转为r行c列的数组降为一维数组的原理为:由于j < n 故 i = x / n ; j = x % n;代码为:class Solution {public: vector<vector<int>> matrixReshape(vector<vector<int>...
2021-11-27 16:51:32
3596
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 二分查找
1.简单的二分查找:704. 二分查找 - 力扣(LeetCode) (leetcode-cn.com)正常解法:class Solution {public: int search(vector<int>& nums, int target) { int l = 0,r = nums.size() - 1; while(l <= r){ int mid = (l + r ) >> 1; .
2021-11-09 16:49:10
3732
原创 KMP字符串匹配详解
首先我们来了解一下KMP是什么,简单来说他就是检查B串在A串中是否出现,字符串匹配最简单的想法就是两层for循环遍历,时间复杂度为O(N^2),暴力解法会有一个很浪费时间的点。举个栗子: 由于在第五个字符不匹配,那么暴力就是依次往后移位遍历,但我们会发现,字串中会出现相同的字段 由于后缀AB已经遍历相同,那么我们可以从第三个字符也就是'C'来判断,更节省时间,假如我们直接每个位置前面的最长相同前后缀,那么代码就可以写成: int KMP(string...
2022-04-16 14:02:19
1490
原创 从中缀表达式转换成后缀表达式求值
class Solution { private static int getInStackPriority(char ch) { switch(ch) { case '(':return 1; case '*':return 3; case '/':return 3; case '+':return 2; case '-':return 2; .
2022-03-30 00:17:47
315
原创 回文串之中心扩展法
思想:从中心往外扩, 中心分为一个字符和两个字符,三个字符可有1个字符扩展,同理四个字符可有两个字符扩展,注意边界错误//中心扩展法class Solution { public int countSubstrings(String s) { int n = s.length(); int nums = 0; for(int i = 0 ; i < n; i++){ nums++; ...
2022-03-21 00:53:31
282
原创 二分题集
升序二分:该题可转换成求多少个符合要求队列,但肯定不用真正的队列,用二分升序即可。 二分思想:如果遇到比他还小的数则替换,否则添加,实现一个升序序列,求长度即可求出答案#include <bits/stdc++.h>using namespace std;vector<int>ans;int main(){ std::ios::sync_with_stdio(false); int n , m; cin >...
2022-03-20 08:39:02
255
原创 单调栈集
单调栈详情请移步:(107条消息) 详解单调栈算法_Gene_I must wait for the sunrise-CSDN博客_单调栈算法单调栈用途的关键因素为:一次「单调递增栈」的过程,可以求得每个数字左边第一个小于等于它的数,以及右边第一个小于它的数,此处需注意「小于等于」和「小于」的区别。除此之外,「单调递减栈」将上述的「小于」改为「大于」即可成立。此处的 「小于等于」与「小于」的区别 关键在于入栈时的判断条件 递减栈主要用求第一个大于当前数的位置,栈中存的是数值的下标,...
2022-02-26 23:49:18
257
原创 模拟题集
1:1706. 球会落何处 - 力扣(LeetCode) (leetcode-cn.com)方法一:低级模拟,乍眼一看深搜,但是会超时,不知为何,最后发现传输grid参数时没有引用,超时,对于dfs中的参数尽量引用传入否则超时int a , b ;class Solution {public: vector<int> findBall(vector<vector<int>>& grid) { int m = ...
2022-02-24 13:00:44
635
原创 解算法题小技巧
1:字符串与数组存储基本相似,故都可以可以利用sort来排序2:map,set中理论上可以存任何东西,包括本身,故在能存一些比较特别的数据,往往利用这样的存储方式更容易解题...
2022-02-23 22:26:34
303
原创 BFS(广度优先搜索)题集
BFS基本都是以队列来实现的,一层一层的搜索,从最先入队的位置开始搜索,入队后把改点抛弃模板题: 首先第一思想就是搜索,显而易见为bfs#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N =1e5+1;string str1,str2;int ans , sx;int dx[6] = {1,2,3,-1,-2,-3};map<string,...
2022-01-09 23:05:00
517
原创 关于栈的算法题合集
1.地址:224. 基本计算器 - 力扣(LeetCode) (leetcode-cn.com) 首先肯定要用栈来解决括号问题,那么我们可以用pair来存储,如果是数字记录为(0,num);如果是左括号记录为(1,sgn)。其中sgn为左括号前的正负号,碰到右括号就直接将上一个左括号之间的元素全部取出来完成计算把3-2化成3+(-2),sgn为标记正负号class Solution {public: int calculate(string s) { ...
2022-01-08 22:01:41
1014
原创 杂题选讲
1.地址:525. 连续数组 - 力扣(LeetCode) (leetcode-cn.com)大致题意:求长度最长的连续子数组,且该连续数组中0与1的长度相同该题的关键解法: 把0变成-1求前缀和,然后将前缀和存进Map中,当该前缀和已存在Map中,说明此段数组和为0class Solution { public int findMaxLength(int[] nums) { int res = 0 , sum = 0; //res...
2022-01-05 13:50:02
520
原创 C++优先队列、Java堆
优先队列实际上是堆根节点的值比所有节点值都大,称为最大堆;根节点的值比所有节点值都小,称为最小堆;基本操作:top 访问队头元素 empty 队列是否为空 size 返回队列内元素个数 push 插入元素到队尾 (并排序) emplace 原地构造一个元素并插入队列 pop 弹出队头元素 swap 交换内容第一种用法:priority_queue<int> q1;//默认从大到小排序,整数中元素大的优先级高 第二种用法://升序队列 大顶堆prio
2021-12-23 23:55:20
857
原创 离散(集合论)
集合代数: 相对补集:A - B 即不在B中并且在A中的 这个题建议画个图来判断相对补集与广义并,比较好理解 有包含原理知: 二元关系: 注意传递性:如果没有A到B、B到C,那么也具有传递性,即不具有传递能力的传递性关系的闭包:r(R) 自反闭包 s(R)对称闭包 t(R) 传递闭包 ...
2021-12-19 19:21:22
5136
1
原创 离散(代数结构)
代数系统、群与环参考:(80条消息) [离散数学] 第五章 代数结构_QAQ! 的博客-CSDN博客_左孝凌离散数学第五章答案代数结构 格与布尔代数参考:(81条消息) 离散数学第六章 格和布尔代数_m0_56150664的博客-CSDN博客_离散数学格与布尔代数...
2021-12-18 21:05:31
535
原创 离散(图论)
一、图的基本概念:握手定理:在任何无向图中,所有顶点的度数之和等于边数的2倍; 在任何有向图中,所有顶点的度数之和等于边的2倍,所有顶点的入度之和等于出度之和等于边的条数; 简单图:在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图 无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图 顶点度数 = 点数 - 1 有向完全图:在无向图中,如果任意两个顶点之间...
2021-12-17 21:21:01
2354
1
原创 环形链表(快慢指针方法)
地址:142. 环形链表 II - 力扣(LeetCode) (leetcode-cn.com)快慢指针可以判断是否存在环: 首先第一点、fast指针一定先进入环中,如果fast指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。判断环之后如何找到入环的第一个节点:相遇之时可得:2*(x+y)= x+y+n(y+z) 化简的 x = (n-1)*(y+z) + z 由此知:假设node1节点从头开始,node2节点从相遇位置开...
2021-12-10 22:38:38
629
原创 轮转数组(NB方法)
地址:189. 轮转数组 - 力扣(LeetCode) (leetcode-cn.com)要求:空间复杂度为O(1)有第一个实例知:反转后的数组:(0-(k%n-1)) 反转 + ((k%n)- (n-1))反转后等于原数组反转故解决方法为:先把原数组进行反转,然后(0-(k%n-1)) 反转 + ((k%n)- (n-1))反转class Solution {public: void rotate(vector<int>& nums, int .
2021-12-09 23:23:10
673
原创 求n个滑动窗口最大值时的区间首地址
地址:689. 三个无重叠子数组的最大和 - 力扣(LeetCode) (leetcode-cn.com)前言一:一个滑动窗口时class Solution1 {public: vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) { vector<int>arr; int sum = 0, maxsum = 0; for(in
2021-12-08 21:04:24
174
原创 大整数乘法与大整数加法
大整数乘法:43. 字符串相乘 - 力扣(LeetCode) (leetcode-cn.com)不能以正常算数的方法来做,不然太麻烦num1的长度为m,num2的长度为n,那么num1*num2的长度最长为m+n,最短为m+n-1证明:由于num1和num2的乘积最大长度为m+n,因此创建长度为m+n的数组arr来存储成绩。对于任意num1[i]*num2[j]的结果位于arr[i+j]与arr[i+j+1] ,i+j处存储进位,i+j+1处存储余数class Soluti..
2021-12-08 20:02:16
533
原创 边界着色(BFS与DFS)
地址:1034. 边界着色 - 力扣(LeetCode) (leetcode-cn.com)这个题的翻译有问题大概意思如下: 连通分量:就是初始位置上下左右四个方向且颜色相同的个子为连通分量 联通分量边界:1、这个连通分量的位置本身就处于网格的边界 2、这个联通分量周围有与它颜色不相同的格子以红色为例:红色出现框柱的为一个联通分量,而紧挨着红色粗线的方块就是连通分量边界clas...
2021-12-07 15:43:14
260
原创 编辑距离(动态规划)
地址:72. 编辑距离 - 力扣(LeetCode) (leetcode-cn.com)模式识别:一旦涉及子问题,可以用自顶向下的递归和自顶向上的动态规划如果用动态规划来写的话,需要一些前置知识;即在word1后添加一个字符等于在word2后删除一个字符,那么就把字符串的修改总结为三种1:在word1后添加一个字符 2:在Word2后添加一个字符 3:修改Word1余Word2的最后一个字符动态规划四部曲: 1:确定dp数组及含义那么由于有两个字符串匹配必...
2021-12-06 19:15:13
705
原创 超级次方(快速幂思想)
地址:372. 超级次方 - 力扣(LeetCode) (leetcode-cn.com)乍眼一看a的b次方,还真没想起来快速幂,但由于这道题b的长度为2000,无法直接使用快速幂,但本质还是分治的思想,快速幂的思想为把b化为二进制,然后用位运算,如果为1则乘。由于b的长度过长,可以把b分为,b/10... , b/100,b/10,例如当b为二百是,先计算个位,然后十位,百位等。class Solution {public: int superPow(int a, ve..
2021-12-05 13:03:00
680
原创 快速幂模板
long long binpow(long long a , long long b){ if(b == 0) return 1; long long res = binpow(a,b/2); if(b % 2) return res*res*a; else return res*res; }
2021-12-05 11:37:19
190
原创 节点个数为n的二叉搜索树的个数(动态规划)
地址:96. 不同的二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)动态规划解题:首先是定义dp数组,然后推导出递推公式,确定状态方程,确定遍历方式先把n(1-3)的树列出来寻找规律,节点为0按定义算二叉树,故算二叉搜索树可以看到n=2时,个数 = 左子树0个元素*右子树1个元素 +左子树1个元素*右子树0个元素从n=3可以看出,头结点为1、3时子树的排列方式与2相同,头结点为2时的子树排列方式与1相同头结点为1 = 左子树0个元素*右子树2个...
2021-12-02 20:08:15
1550
原创 几何
地址:223. 矩形面积 - 力扣(LeetCode) (leetcode-cn.com)该题的核心为求重叠部分的面积: 核心:将两条水平边投影到x轴,将两条竖直边投影到y轴,计算重叠边长,从而计算重叠部分面积class Solution {public: int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2)...
2021-11-29 19:09:55
258
原创 杂题集(思维题)
地址:12. 整数转罗马数字 - 力扣(LeetCode) (leetcode-cn.com)该题需要理解清楚整数转罗马数组的规则: 1.特殊的六种需特殊表示 2.例如:30 = XXX由于规则的特殊性需要从先计算最高位,从高到低计算class Solution {public: string intToRoman(int num) { //牛逼之处:用数组记录且为从大到小 int values[]={1000,900,5...
2021-11-28 22:25:39
147
原创 C++ string实用总结
数字类型转为string字符串to_string(num);#include<bits/stdc++.h>using namespace std;int main(){ int n = 123456; string str = to_string(n); cout << str; return 0;}string字符串转为数字类型stoi(int),stol(long), stof(float), stod(double)#incl
2021-11-28 20:00:04
331
原创 贪心题目集
地址:55. 跳跃游戏 - 力扣(LeetCode) (leetcode-cn.com) 该题当时的思路为找到能跳到最长的位置是否能跳的最后,但没有考虑中间有零间断与后半部分隔开,但即使想到,当时也没有想到好的解决办法正确思路:循环求出改点之前能跳到的最大位置,用该位置比较,如果改为大于能跳到的最大位置,返回FALSE,如果无返回FALSE则返回TRUE代码:class Solution {public: bool canJump(vector<int>...
2021-11-27 23:49:13
86
原创 动态链表反转(总结)
由于小编能力有限,递归反转链表还没整理,下面是一些常规反转写法1.:206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)使用头插法,后面的每一个节点都插到前一个节点前class Solution {public: ListNode* reverseList(ListNode* head) { if(head == nullptr || head->next == nullptr) return head; ...
2021-11-25 15:26:02
256
原创 位运算题目集
一、78. 子集 - 力扣(LeetCode) (leetcode-cn.com)记原序列长度为n,原序列中的每个数字在子集中有两种状态,1为存在,0为不存在,那么就可以表示为长度为n的0/1串class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> vet; .
2021-11-18 20:22:39
480
原创 unordered_map 与map实用方法总结
1.遍历方式for(auto &[key,value] : map){ //key即first , value 即 second }2.插入方式void insert(string key, int val) { map[key] = val; //好处是能更改相同key的val值 } unordered_map<string,int>map = { {"key1",1},
2021-11-15 13:43:14
461
原创 排序集合
快速排序: 785. 快速排序 - AcWing题库先把该序列排好,然后利用一分为二递归#include<bits/stdc++.h>using namespace std;const int N = 1e6 +10;int q[N],n;void q_sort(int q[] , int l , int r){ if(r <= l) return ; int x = q[l ...
2021-11-11 11:23:14
208
原创 最长回文子串(动态规划)
传送门:https://leetcode-cn.com/problems/longest-palindromic-substring/dp[i][j]: 长度大于3的情况:i表示左边界,j表示右边界 如果dp[i+1][j-1]符合要求切s[i] == s[j]的话,那么i到j的字符串就满足要求 长度小于3的情况: s[i] == s[j] and j - i < 3;状态转移方程:dp[i][j] = (s[i] == s[j]) and (j - i &...
2021-10-30 17:58:53
98
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人