自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法常见问题

reverse(v.begin(),v.end())

2021-12-26 21:19:35 163

原创 c++高性能服务器搭建学习

学习文章

2022-10-17 10:54:14 931

原创 计算机网络小结

域名解析过程域名解析+三次握手+四次挥手http和https黑客攻击、拒绝服务攻击(DoS)、服务器劫持:拒绝服务攻击是一种简单的破坏性攻击。通常是利用传输协议下的某个弱点、系统存在的漏洞、或服务器的漏洞。对目标系统发起大规模的进攻。用超出目标处理能力的海量数据包消耗可用系统资源、宽带资源等,造成程序缓冲区溢出错误,使其他合法用户无法正常请求。最终致使网络服务瘫痪,甚至系统死机。拒绝服务攻击问题也一直得不到合理的解决,究其原因是因为网络协议本身的安全缺陷,从而拒绝服务攻击也成为了攻击者的终极

2022-03-16 16:50:44 859

原创 104. 二叉树的最大深度

方法一:dfsclass Solution {public: int maxDepth(TreeNode* root) { if (root == nullptr) return 0; return max(maxDepth(root->left), maxDepth(root->right)) + 1; }};作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/maximu

2022-02-16 11:09:46 470

原创 76. 最小覆盖子串(滑动窗口)

滑动窗口思路用一个字典need来表示当前滑动窗口中需要的各元素的数量count记录所需元素的总数量,当我们碰到一个所需元素c,不仅need[c]的数量减少1,同时count也要减少1class Solution {public: string minWindow(string s, string t) { vector<int> need(128,0); int count = 0; for(char c : t)

2022-02-10 13:55:34 646

原创 151. 翻转字符串里的单词

这里空间复杂度o(n)class Solution {public: string reverseWords(string s) { int i = s.size() - 1; string ans; while(i >= 0) { int c = 0; while(i >= 0 && s[i] == ' ') --i; while(

2022-02-09 14:47:21 837

原创 105、从前序与中序遍历序列构造二叉树

方法一:递归class Solution {private: unordered_map<int, int> index;public: TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder..

2022-02-08 15:02:25 134

原创 72. 编辑距离(困难)

class Solution {public: int minDistance(string word1, string word2) { vector<vector<int>>dp(word1.size()+1,vector<int>(word2.size()+1,0)); for(int i =1 ;i<=word1.size();i++){ dp[i][0] = i; }..

2022-01-29 16:05:40 572

原创 148. 排序链表(归并排序细节,复杂)

归并和快排的方法都要掌握题目要求时间空间复杂度分别为O(nlogn)和O(1)时间复杂度是 O(nlogn) 的排序算法包括归并排序、堆排序和快速排序(快速排序的最差时间复杂度是 O(n^2),其中最适合链表的排序算法是归并排序。归并排序基于分治算法。最容易想到的实现方式是自顶向下的递归实现,考虑到递归调用的栈空间,自顶向下归并排序的空间复杂度是O(logn)。如果要达到 O(1)的空间复杂度,则需要使用自底向上的实现方式。解答一:归并排序(递归法,空间复杂度是O(logn))/** * D

2022-01-29 10:03:26 1239 1

原创 144. 二叉树的前序遍历(前中后序递归+迭代总结)

迭代和递归的方法!二叉树遍历详细解释遍历二叉树的方法合集94 二叉树的中序遍历144 二叉树的前序遍历145 二叉树的后序遍历一、递归前序遍历:class Solution {public: void traversal(TreeNode* cur, vector<int>& vec) { if (cur == NULL) return; vec.push_back(cur->val); // 中 t

2022-01-28 13:49:14 238

原创 2. 两数相加

注意细节!!/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), nex

2022-01-27 14:45:55 655

原创 19. 删除链表的倒数第 N 个结点

注意两个用例[1,2,3,4,5]2[1]1/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode

2022-01-26 17:00:47 408

原创 82. 删除排序链表中的重复元素 II

重点:有序链表,所以,一个节点的值出现不止一次,那么它们必相邻。方法一:递归class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if (!head || !head->next) { return head; } if (head->val != head->next->val) { h

2022-01-26 16:04:20 347

原创 8. 字符串转换整数 (atoi)

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31, 2^31 − 1]。如果数值超过这个范围,请返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。class Solution {public://o(n)//测试://正数的情况;正常,溢出//负数的情况;正常,溢出//有其他字符的情况 int myAtoi(string s) { int res =0; int i=0;

2022-01-26 14:20:26 190

原创 69. Sqrt(x)

方法一:二分法class Solution {public: int mySqrt(int x) { //注:在中间过程计算平方的时候可能出现溢出,所以用long long。 long long i=0; long long j=x/2+1;//对于一个非负数n,它的平方根不会大于(n/2+1) while(i<=j) { long long mid=(i+j)/2;

2022-01-26 09:01:41 172

原创 剑指 Offer 22. 链表中倒数第k个节点

快慢指针,快的先走k步

2022-01-25 18:42:51 119

原创 124. 二叉树中的最大路径和

我们用题目的示例来描述一下这个算法过程:(理解如何递归很关键)> 1. 从 dfs(-10) 开始, 1.1 dfs(9): 1.1.1 左孩子为空;贡献为 0 1.1.2 右孩子为空,贡献为 0 1.1.3 更新 res = max (-∞,(9 + 0 + 0)) = 9 1.1.4 返回 dfs(9) = 9 + max(左孩子贡献,右孩子贡献)) = 9 ..

2022-01-25 18:31:33 237

原创 56. 合并区间

对区间左端点进行排序,然后比较上一个区间右端点与当前区间左端点进行合并不相交包含、扩展class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { if (intervals.size() == 0) { return {}; } sort(intervals.

2022-01-23 16:26:21 240

原创 143. 重排链表

寻找链表中点 + 链表逆序 + 合并链表/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next)

2022-01-23 15:20:46 343

原创 199. 二叉树的右视图

一、BFS思路: 利用 BFS 进行层次遍历,记录下每层的最后一个元素。时间复杂度: O(N)O(N),每个节点都入队出队了 1 次。空间复杂度: O(N)O(N),使用了额外的队列空间。作者:sweetiee链接:https://leetcode-cn.com/problems/binary-tree-right-side-view/solution/jian-dan-bfsdfs-bi-xu-miao-dong-by-sweetiee/来源:力扣(LeetCode)著作权归作者所有。商业转

2022-01-21 14:59:11 801

原创 42. 接雨水

本文深度讲解如下三种方法:双指针法:时间复杂度为O(n^2)。 空间复杂度为O(1)。动态规划单调栈详细讲解

2022-01-20 19:59:18 146

原创 70. 爬楼梯(总错)

class Solution {public: int climbStairs(int n) { vector<int>dp(n+1,1); for(int i=2;i<=n;i++){ dp[i] = dp[i-1]+dp[i-2]; } return dp[n]; }};

2022-01-19 23:06:52 291

原创 232. 用栈实现队列

class MyQueue {public: stack<int> stIn; stack<int> stOut; /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { stIn.push(x); } /*

2022-01-19 22:58:06 4591

原创 94. 二叉树的中序遍历

非递归形式颜色标记法:其核心思想如下:使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。如果遇到的节点为灰色,则将节点的值输出。class Solution {public: vector<int> inorderTraversal(TreeNode* root) { vector<int> result; stack<pair<

2022-01-19 20:36:52 108

原创 memset

memset解释

2022-01-19 15:00:46 184

原创 C++强制类型转换操作符 static_cast

解释

2022-01-19 14:43:21 344

原创 typedef void *HANDLE

这是typedef定义,就在void*键入罢了。那是,HANDLE相当于void ,们能够叫它披着句柄皮的指针(PS:指针和句柄是有差别的,在这说句废话);,它会自动将你写得HANDLE理解为void。总结:1)void*类型的指针其实本质就是一个过渡型的指针状态,必须要赋予类型(强制类型转换)才能正常使用。2)只能单向类型转换。void可以转化成其他类型,但是有类型的不能转化成void。2)在函数调用过程中的使用作为输入输出参数也非常好用,可以灵活使用任意类型的指针,避免只能使用固定类型的指针。

2022-01-19 10:57:14 5087

原创 300. 最长递增子序列

最长上升子序列是动规的经典题目,这里dp[i]是可以根据dp[j] (j < i)推导出来的,那么依然用动规五部曲来分析详细一波:dp[i]的定义dp[i]表示i之前包括i的最长上升子序列的长度。状态转移方程位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] +

2022-01-18 21:37:36 138

原创 704. 二分查找

// 版本一class Solution {public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right] while (left <= right) { // 当left==right,区间[left, right]依然有效,所

2022-01-18 20:54:01 93

原创 54. 螺旋矩阵

class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int>ans; if(matrix.empty()) return ans; int s=0; int x=matrix.size()-1; int z=0; int y=ma

2022-01-18 20:07:36 190

原创 浏览器输入url

一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?主要包括以下几个基本步骤:浏览器的地址栏输入URL并按下回车。浏览器查找当前URL是否存在缓存,并比较缓存是否过期。DNS解析URL对应的IP。根据IP建立TCP连接(三次握手)。HTTP发起请求。服务器处理请求,浏览器接收HTTP响应。渲染页面,构建DOM树。关闭TCP连接(四次挥手)。1. DNS域名解析:域名解析的过程实际是将域名还原为IP地址的过程。浏览器缓存:浏览器会按照一定的频率缓存 DNS 记录。操

2022-01-18 14:05:59 949

原创 23. 合并K个升序链表

优先队列原链接优先队列方法1: 建立优先队列(最大堆或者最小堆均可),全部元素接连入队;最后再不断弹出,构建链表。这也是一种想法,不过这样子效率就有些低下了。方法2: 依然建立优先队列,不过不需要全部元素一次性入队;只需要让链表头元素入队即可,弹出该元素后,该链表往后移。class Solution {public: // 小根堆的回调函数 struct cmp{ bool operator()(ListNode *a,ListNode *b){

2022-01-17 21:13:39 90

原创 http,https

网络分层一、HTTP 和 HTTPS 的基本概念HTTP:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定,也就是说,http协议规定了超文本传输所要遵守的规则。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。它可以使浏览器更加高效。是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的

2022-01-14 15:14:25 1496

原创 46. 全排列

相关问题:77.组合问题、131.切割问题和78.子集问题回溯三部曲递归函数参数递归终止条件单层搜索的逻辑大家此时可以感受出排列问题的不同:每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了代码class Solution {public: vector<vector<int>> result; vector<int> path; void backtracking (vector&l

2022-01-13 20:40:03 112

原创 os内存管理、虚拟内存(重要)

内存内存用于存放数据的硬件,程序运行前需要先放到内存中才能被cpu处理如何区分程序的数据存放在内存的什么地方?----给内存的存储单元编地址,从0开始每个地址对应一个存储单元,如果按字节编址则每个存储单元大小为一个字节。逻辑地址与物理地址我们写的代码需要翻译成cpu能识别的指令,这些指令会告诉cpu应该去哪个地址操作数据。数据的实际存放地址就是物理地址,但是实际上在生成机器指令的时候并不知道该进程的数据会被放到什么位置,所以编译生成的指令一般是使用逻辑地址。物理地址(绝对地址):实际放入内存

2022-01-13 16:07:35 1054

原创 template <typename T>

一但声明了模板(template < typename T> ),就可以将类型参数用于类的成员函数和成员变量了。换句话说,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。如写一个交换函数:void swap(int &a, int &b){ int t = a; a = b; b = t;}void swap(char &a, char &b){ char t = a; a =

2022-01-12 10:06:20 507

原创 200. 岛屿数量 dfs

L200. 岛屿数量 (Easy)463. 岛屿的周长 (Easy)695. 岛屿的最大面积 (Medium)827. 最大人工岛 (Hard)岛屿问题总结二叉树dfs二叉树的 DFS 有两个要素:「访问相邻结点」和「判断 base case」。void traverse(TreeNode root) { // 判断 base case if (root == null) { return; } // 访问两个相邻结点:左子结点、右子结点

2022-01-11 21:30:56 316

原创 typedef

typedef的用法

2022-01-11 14:17:07 207

原创 typedef int (* func)(int ,int )

详细解释

2022-01-11 10:54:35 643

原创 重载、隐藏、重写(覆盖)

重载的参数不同,函数体不同;隐藏的参数可以不同,函数体不同;重写或者覆盖仅仅函数体不同。重载根据名字可以猜测一定有重新的东西加进来;覆盖,根据这个名字就能联想到要一模一样才能覆盖。隐藏的话只要盖上就行,不一定非要一模一样。重载为什么改变参数就可以实现调用不同的函数?因为C++在编译的时候会对函数进行重命名,保证函数名的唯一性,而重载函数的参数不同,就会被命名为不同的函数名。构造函数可以被重载么?析构函数呢?构造函数可以被重载,因为构造函数可以有多个且可以带参数。析构函数不可以被重载,因为

2022-01-06 16:25:52 436

空空如也

空空如也

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

TA关注的人

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