自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 收藏
  • 关注

原创 C++ char转为string类型

char转string

2022-10-20 21:36:43 641 1

原创 关于map遍历的几种方式

map遍历写法

2022-09-28 16:16:28 1410

原创 2192. 有向无环图中一个节点的所有祖先(邻接表 加 拓扑排序)

图论、邻接表、拓扑排序

2022-09-13 16:48:51 249

原创 起点可为任意点的dijkstra最短路

图论dijkstra

2022-09-01 22:06:47 98

原创 关于类之间赋值时生成临时对象并调用析构函数的时机

类 对象 构造 析构 重载

2022-09-01 18:51:56 319

原创 AVL树插入代码(单旋、双旋)

AVL简单构建

2022-08-18 12:48:57 148

原创 IAR_使用以及一些关键字

IAR语法以及一些关键字

2022-08-15 15:33:14 323

原创 TCP三次握手与四次挥手详细解释与文献参考

TCP三次握手一些深入问题

2022-08-10 11:26:42 766

原创 关于C++类中成员函数传入pthread_create的问题以及相关函数参数的理解

pthread_create在C++中调用类内成员函数时需要注意 只能调用静态成员函数。

2022-08-05 10:33:12 2368

原创 linux多进程通信()

多进程通信

2022-08-04 08:28:04 315

原创 C语言sizeof()和strlen()

sizeof()和strlen()的区别

2022-08-03 10:59:41 2347 1

原创 linux多线程通信与同步(线程创建以及锁、条件变量)

线程间通信、同步以及相应代码案例

2022-08-02 16:58:58 442 1

原创 451. 根据字符出现频率排序 Sort重载 lambda表达式捕获于参数

思路是用哈希表记录每个字符出现的次数,然后通过出现的频次重新对s进行排序:class Solution {public: string frequencySort(string s) { unordered_map<char, int> mp; for (auto c : s) mp[c]++; sort(s.begin(), s.end(), [&](char a, char b) { if (m.

2022-05-27 17:31:05 125

原创 449. 序列化和反序列化二叉搜索树 stringstream

二叉搜索树,左子树小于节点,右子树大于节点(准确的说二叉搜索树有两种一种是左子树小于等于节点,还有一种是右子树大于等于节点,具体看题目,这题的题目有歧义,但是这题的节点是没有重复数值的)。序列化为前序遍历,反序列化时,头节点为第一个节点,左边设置区间(minv, root->val),当遍历的数组数组大于当前节点的数值,则跳出剩余的在右子树上,右边设置区间(root->val, maxv)如下所示/** * Definition for a binary tree node. * s.

2022-05-27 16:01:55 95

原创 447. 回旋镖的数量 求三个距离相同的点有几种排列方式 map的遍历写法

题意就是在一组数据里 一个点到另外两个点的距离相等,这样的三个点有几种排列方式,比如点 i到点k的距离和点i到点j的距离相等,那么回旋镖为:【i,j,k】或【i,k,j】先遍历点i,在其中统计到点i的距离相同的点的数量c,最终在这个i点里的组合方式有:c * (c - 1)个,(排列组合问题)codeclass Solution {public: int numberOfBoomerangs(vector<vector<int>>& p) { .

2022-05-27 10:32:31 157

原创 LeetCode 437. 路径总和 III 二叉树前缀和 回溯

对于一维,我们维护一维数组的前缀和,要求某一段相加和为sum在i前出现几次,就是求前缀和数组 s[i] - s[j] == sum,的点有几个,其中j+1 ∈[1, i]。用这个思路用在二维数组,用一个哈希表来维护之前节点出现的前缀和的次数即可,当前遍历到的节点是s[i], 哈希表里装着的是s[j]的出现次数:s[j] = s[i] - sum。记得加入是s[0] = 0,以及数据太大用long long/** * Definition for a binary tree node. * str

2022-05-26 10:42:51 119

原创 436. 寻找右区间 Set中lower_bound的使用方法

遍历一遍原二维数组,将starti和i对应记下,再遍历一次,对每个区间的右端点,寻找第一个大于等于他的区间用lower_bound(),可在有序数组中找到第一个大于等于目标值的位置,二如果找到,返回那个迭代器,找不到,返回end();原型 set<T> st; //declaration st<T> st::iterator it; //iterator declaration it=st.upper_bound(T key);Parameter:..

2022-05-25 20:50:36 597

原创 435. 无重叠区间 区间贪心 sort重载(lambda)

区间贪心的解法背过:按区间右端点大小来从小到大排序遍历排序后的数组,判断左端点与上一个右端点的大小,如果小,则删去这个区间,如果大,则将该区间的右端点更新为比较时候的右端点的值注意sort重载时的写法,这里要使用引用传递,不然会超时Codeclass Solution {public: int eraseOverlapIntervals(vector<vector<int>>& intervals) { int res = 0; .

2022-05-25 19:52:33 80

原创 406. 根据身高重建队列 贪心想法加二分和树状数组的优化(sort重载)

如何排序:[[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]我们先按从小到大来进行排列,当first相同时,second从大到小排列[[4,4],[5,2],[5,0],[6,1],[7,1],[7,0]]对于目标数组设为res,预处理n个空间,这里n为上面的数组的大小n == 6,按照sort以后的数组,按该顺序依次插入res的获得顺序为:[[],[],[],[],[4,4],[]][[],[],[5,2],[],[4,4],[]][[5,0],[],[5,2..

2022-05-20 11:03:01 81

原创 402. 移掉 K 位数字——贪心

对第i个数,我们考虑前 i - 1个数,假设到第i个数,s[i] 和 前一个数s[i - 1], 我们有以下几种情况,来考虑是否删除s[i - 1]这个数:s[i - 1] > s[i]删除s[i - 1],因为删除后,最后s[i - 1]的位置,由更小的s[i]代替,得到的答案比不删除时,是s[i - 1]本身更小s[i - 1] < s[i]原理同上,我们不能删除s[i - 1] == s[i]这个情况删和不删是等价的,那么我们就要交给下一个(i + 1)来解决,所以现在不能.

2022-05-17 15:58:04 128

原创 二维费用的01背包问题

简而言之,小智有一堆精灵球,皮卡丘有一定的体力值,有一批小精灵需要收服,每一只需要花费小智一定数量的精灵球以及皮卡丘需要消耗一定数量的体力值,问在最多能抓几只,抓相同只得情况下,皮卡丘体积所剩最多为多少。和一维背包问题是一样得,不过在状态计算得时候要考虑两维而已,二维费用背包问题同样可以优化到一维:Code#include <iostream>#include <algorithm>using namespace std;const int N = 1010..

2022-05-02 22:57:52 309

原创 输入输出的模板(cin getline()) stringstream

以下几种对应的输入以及输出输入一行以回车结束的数据,要得到的是int数值输入: int a[N], n; while (cin >> a[n]) n++; for (int i = 0; i < n; i++) { //... }或者用stringstream,注意包含头文件#include<sstream>const int N = 1010;int n;int h[N];int main(){ string line

2022-04-29 11:53:51 317

原创 381. O(1) 时间插入、删除和获取随机元素 - 允许重复 (哈希表嵌套, 返回随机值 rand())

首先知道rand() % n 表示从[0, n - 1]中出一个随机数,在windows下rand()的范围是33767, 在Linux下会到108级别,可以随机很大的数这一题要做到在时间复杂度为O(1)的情况,插入要求我们用到哈希表,返回O(1)则需要使用数组,这题需要哈希表和数组结合,如果插入的没有重复元素,很简单:vector<int> nums;unordered_map<int,int>hash;建立val 与 nums下标的映射关系即可;但是有重复元素的情..

2022-04-29 11:31:18 163

原创 377.组合总和 Ⅳ

咋一看很很像背包问题,但是呢,背包问题解决的是有限制的组合问题,在有限制的组合条件下选择最好的一个解决方案,背包问题一般是不考虑顺序的,所以不能用背包问题来做。这题思路不要被带跑偏了,就是简单的dp,假设我们需要的target 为 k,f[k]表示结果为k的所有解决方案,用最后一个长度为j的数来划分,其中j为nums中的某一个数,上面的例子j可以为1、2、3,即我们枚举所有可能的组合,最尾巴的数为(x,x,x,x,j) 的这种情况,他的状态转移可以由 f[k - j](k >= j)得到,枚举k..

2022-04-29 11:17:37 101

原创 ACW 方格取数 (最长上升子序列模型)

这一题用到的方法在于,理解成两条路径,f[i1][j1][i2][j2]来表示分别从(1,1)(1,1)走到(i1,j1)(i2, j2)时的最大值,这时候的时间复杂度时O(n4)进一步可以发现,问题求的是到终点时,需要的最大值,即两条路径终点重合,两条路走的步数是一样的,假设k为走的步数, k = i1 + j1 = i2 + j2,那么原来的四维数组便可以简化成三维f[k][i1][i2],纵坐标分别是k - i1与k - i2。因为一个点只能拿一次,且只能向下或者向右,除非同时到达一个相同的点..

2022-04-28 22:45:44 183

原创 拦截导弹(cin 最长上升子序列模型 函数形参为数组)

在分析这个问题之前,我们到不如先来说一下对于这种给定的样例,应该怎么输入:两种方法一种用stringstream类来解决还有一种就是最简单的:while (cin >> a[n]) n++;循环来解决,这个循环在回车的时候结束,输入的n就是所需要的个数。或:#include <sstream>.int main() { string line; getline(cin, line); stringstream ssin(line); w.

2022-04-28 21:56:39 252

原创 【无标题】

这一题,如果直接使用单调队列做计算,在数的覆盖上,不好做取舍,所以这种题目用最原始的DP方法,枚举到的数为a[i],此时再遍历一次从0到i - 1中所有小于i的数a[k],对应的和f[k] + a[i]后的最大值即可,记为f[i]。#include <iostream>#include <algorithm>using namespace std;const int N = 1010;int n, res;int a[N], f[N];int main() {.

2022-04-28 15:18:26 115

原创 常量指针与指针常量_this指针

真是令人头大的东西:先看写法:指针常量:int* const p1 = &t;常量指针:const int* p2 = &t;     int const * p3 = &t;指针在前(int* )就是指针常量:指针是一个常量;常量在前(或者除以上书写外)就是常量指针:常量是一个指针?这种说法是不是怪怪的?所以应该为指针指向一个常量。指针常量,即指针指向的地址是不可以改变的,所以只能在定义时初始化,但该地址装的内容可以改变:#include<iostream

2022-04-22 17:14:50 553

原创 树形dp 2246. 相邻字符不同的最长路径

leetcode周赛的一题,这里可以对比出使用邻接表模拟数组以及使用vector容器的时间复杂度对比。回到问题本身,是一体典型的树形dp问题,遍历每一个节点,返回和每一个子节点所构成的最长路径,而答案是某个节点(如果有),其最长的两个节点构成的路径之和。...

2022-04-20 15:01:48 525

原创 352. 将数据流变为多个不相交区间 pair 下的 lower_bound()

可以用multimap或者 multiset去维护有序空间,这里用multiset,里面设置为pair<int,int>, 用来存放内部区间的左右两个端点。加入两个哨兵节点每次插入的时候使用upper_bound找到第一个大于插入的数的迭代器位置:auto l = S.upper_bound({x, -1e8});注意这里S是mutiset的 一个对象,里面排序的规则是先用first排序后在用second排序,也就是说当first相等时,second小的排在前面,这里第二个second..

2022-04-01 09:29:53 175

原创 网络基础:数据链路层_公网i私网ip、路由通信、MTU以及ip分片

在本章节开始前,先提出几个问题:公网ip和私网ip的区别是什么,哪个能重复哪个不能?如何实现两个设备之间的信息通信?是通过公网ip查找还是私网ip查找?路由表包含的信息有哪些?ARP协议的作用以及格式?ARP缓存表的作用?NAT地址转换协议的作用是什么?MTU是什么?对网络层IP协议和传输层TCP、UDP有哪些影响? 网络层的ip协议负责路由选择(ip协议进进行选路)。而具体如何从A机器到达B设备,网络层并没有关心,而是数据链路层,负责相邻设备的转发。 网络层进行选路,数据链路层负

2022-03-31 00:31:11 3173

原创 网络基础 L20_1 http UDP tcp深入 重点问题

http协议在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。.滑动窗口MSS最大传输大小的缩写,MSS: Maxitum Segment Size...

2022-03-28 11:13:47 2357

原创 326.3的幂 342.4的幂

区别在于 3是质数,3在int里最大的数1162261467 除了3以及3的倍数以外,没有其他的约数4的幂里会出现2,以及8也会成立,这时候先排除所有不能被4在int最大的数1073741824所%的数以后,再来判断这个数如果除以2,可以除几次,如果除的次数是偶数,说明也是4的幂,如果是奇数,说明不是4的幂,去掉就可以。...

2022-03-27 21:44:05 173

原创 295.数据流的中位数 (对顶堆)

思路:大顶堆和小顶堆codeclass MedianFinder {public:priority_queue<int>q_down;priority_queue<int,vector<int>, greater<int>>q_up; MedianFinder() { } void addNum(int num) { if (q_down.empty()) q_down.push(num); .

2022-03-26 23:13:30 158

原创 331.验证二叉树的前序序列化

如果只给一个前序遍历,是不能构造出二叉树的,但是把空节点也加上,就可以唯一构造一个二叉树,按要求模拟一遍:代码的执行过程被唯一限制住,还有一类是最优化问题,用算法解决该类问题。class Solution {public: int k = 0; string s; bool isValidSerialization(string preorder) { s = preorder + ','; // 保持格式一致, 在末尾加上逗号 if (!d.

2022-03-25 21:25:47 685

原创 105.重建二叉树_(前序与中序遍历构造)

前序遍历:[3, 9, 20, 15, 7]中序遍历:[9, 3, 15, 20, 7]前序遍历知道根节点3, 由中序遍历3的下标为1,知道根节点3左子树只有一个节点9,下标为1后面的所有数在根节点3的右子树上同样右子树第一个节点为20…以此类推构造二叉树一般化这个过程:前序遍历先找到根节点,根据中序遍历,找到左子树有几个节点,并且在前序遍历里以后加上相同数量的个数,找到前序遍历最后的下标,在中序遍历对应下标的查找,可以用哈希表快速查找假设 k 为在中序遍历上找到的前序遍历根节点的下标..

2022-03-25 20:55:28 1366

原创 330. 按要求补齐数组

这种贪心题目,需要理解思路,具有跳跃性从前往后枚举原数组的每一个元素,每到一个元素,记录下当前所能包括的区间,假设之前所枚举到的数nums[i - 1],可以包含区间为[0,x)那么加入现在这个数nums[i],后,可以包含的区间为多少?分成两种情况:nums[i] <= xnums[i] > x第一种情况,加入nums[i]后,所能涵盖的区间变成了:[0,x + nums[i])第二种情况计入nums[i]后所能涵盖的区间为[0, x) ∪ [nums[i], nu..

2022-03-24 20:54:44 207

原创 记忆化搜索:329. 矩阵中的最长递增路径

创建一个二维数组f,遍历一遍原二维数组,往四个方向移动,递归,比较记录四个方向上可以获得的最大值将之记录在f[i][j]里,这样,在遍历的过程中,如果f[i][j]已经有值,则返回该值,最后的时间复杂度为O(n),空间复杂度也为O(n)codeclass Solution {public:vector<vector<int>> matrix, f;int n, m;const int delta[4][2] = {{1, 0},{-1, 0},{0, 1},{0, -..

2022-03-24 19:54:00 414

原创 算法:树状数组

树状数组解决的两个问题:快速求前缀和 O(log2n)修改某一个数 O(log2n)上面两个操作分别用可以实现相应的做法前缀和 O(n) O(1)数组 O(n) O(1)树状数组折中算法原理基于二进制算法:每一个数可以被分为最多log(x)个部分可以使得我们在log(n)的时间复杂度之内,求出前n项的前缀和,分析一个上面每个区间分别由几个数(绿字):再观察每个区间右端点和区间长度的关系:假设一个左开右闭区间(L , R],其区间长度一定是R的二进制

2022-03-22 11:57:20 139

原创 307. 区域和检索 - 数组可修改

树状数组和线段树经典问题树状数组相比线段树,代码段,空间更复杂度底,能用树状数组做的就用树状数组,线段树能做的,树状数组不一定能做。树状数组主要三个模板函数:lowbit(x) : x & (-x) 会返回最后一个1的数求前缀和,求x左边的所有和修改一个数ax += v, 把比x大的位置都更新一遍如何初始化树状数组,比如将原素组a[i]初始化成树状数组,可以将 里面的元素一个个插入到树状数组里,这个时间复杂度是O(nlog(n))的,也是由O(n)的插入方式的,要用到定义,但.

2022-03-22 11:53:28 89

空空如也

空空如也

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

TA关注的人

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