- 博客(307)
- 资源 (1)
- 收藏
- 关注
原创 shell脚本
目录功能点任意目录上传vim配置文件文件锁复制内容到vim调试日志修改系统时间读取ini配置文件功能点日志系统添加调试参数通过参数控制是否开启时间检查更新系统时间配置文件中的空格函数中不加双引号任意目录上传#!/bin/bashif [ $# \= 1 ]then main_path=$1else main_path=/var/home/autoup_all_filefimkdir -p $main_paththis_filepa
2022-01-22 15:55:56
1190
1
原创 LeetCode1359. 有效的快递序列数目
//1359. 有效的快递序列数目/*记f(n)为输入n时的正确答案f(1)只有一种 P1 D1f(2)的时候可以在f(1)的空位上先添加P2,然后在P2后面的空位上添加D2添加P2的地方有3个位置,即 1:P2 P1 D1 2:P1 P2 D1 3:P1 D1 P2针对上面3中情况,D2的位置分别有3、2、1种因此f(2) = f(1) * (3 + 2 + 1);同理,在f(2)的基础上先添加P3,有5中情况,再添加D3,分别有5、4、3、2、1因此f(3) = f(2) * (5
2021-08-31 08:57:11
329
原创 LeetCode381. O(1) 时间插入、删除和获取随机元素 - 允许重复
//381. O(1) 时间插入、删除和获取随机元素 - 允许重复/* * 使用数组来存储所有元素 * 因为不需要考虑顺序,所以插入的话,直接放在数组后面就可以,常数时间 * 主要是删除,删除的时候,需要先查找元素所在的位置,然后删除 * 查找的时候,可以通过哈希map和set结合,记录各种元素的位置 * 用这种方法可以使查找的时间变为常数时间 * 查找之后,就是删除 * 删除的话可以将当前元素和数组的最后一个元素互换内容,然后删除数组的最后一个元素,时间也是常数 * 删除之后,更新一下元
2020-10-31 19:12:00
614
原创 LeetCode463. 岛屿的周长
//463. 岛屿的周长//最先想到的是dfs,一直搜到头,记录答案class Solution {public: vector<pair<int, int>>ns; int m, n; void dfs(vector<vector<int>>& grid, int i, int j) { if (i < 0 || j < 0 || i >= n || j >= m || grid[i][j] == 0
2020-10-30 14:24:06
304
原创 LeetCode103. 二叉树的锯齿形层次遍历
//103. 二叉树的锯齿形层次遍历/* * 维护两个数组 * 一个专门记录奇数层的节点,另一个专门记录双数层的节点 * 一个从头部开始取出节点,另一个从尾部开始取出节点 * 一个将节点放进头部,另一个将节点放在尾部 * 代码用的是双向队列,但是写题解的时候才发现其实算是栈 * 还算简单 */class Solution {public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { v
2020-10-29 22:53:00
201
原创 LeetCode145. 二叉树的后序遍历
//145. 二叉树的后序遍历//正常递归实现,比较简单class Solution {public: vector<int> ans; void dfs(TreeNode* node) { if (node == nullptr) return; dfs(node->left); dfs(node->right); ans.emplace_back(node->val); } vector<int> posto
2020-10-29 22:18:12
150
原创 LeetCode129. 求根到叶子节点数字之和
//129. 求根到叶子节点数字之和//使用dfs深度遍历二叉树//遍历的同时维护一个数组,记录从跟节点到当前节点路径中的数字//遍历到叶子节点的时候,将数组中的所有数字加到ans上//注意:不要忘了返回的时候,删除元素class Solution {public: int ans = 0; void dfs(vector<int>& s, TreeNode* node) { if (node == NULL) return; s.emplace_b
2020-10-29 14:16:54
133
原创 LeetCode142. 环形链表 II
图片转自力扣官方题解//142. 环形链表 II//使用快慢指针判断是否存在环路,如果不会,可以先做141题//关于边界问题,可以用一个具体的例子处理class Solution {public: ListNode* detectCycle(ListNode* head) { if (head == NULL) return NULL; ListNode* p = head; ListNode* q = head->next; while (q !=..
2020-10-28 21:35:33
134
原创 LeetCode1207. 独一无二的出现次数
//1207. 独一无二的出现次数//使用map计数//然后使用set判重class Solution {public: bool uniqueOccurrences(vector<int>& arr) { unordered_map<int, int>ns; for (auto x : arr) ns[x]++; unordered_set<int>s; for (auto x : ns) {
2020-10-28 21:10:20
114
原创 LeetCode144. 二叉树的前序遍历
递归和非递归实现前序遍历//144. 二叉树的前序遍历//dfs,前序遍历模板class Solution {public: vector<int> ans; void dfs(TreeNode* root) { if (root == nullptr) return; ans.emplace_back(root->val); dfs(root->left); dfs(root->right); } vector<i
2020-10-27 23:31:54
169
原创 杭电1301——最小生成树+并差集
kruskal 配并差集模板题#include <iostream>#include <algorithm>#include <cstring>#include <cmath>using namespace std;const int mx = 105;//存储节点上级int f[mx];//存储两节点之间的距离struct node { char a, b; double val;};//排序opbool cmp(no
2020-10-27 16:55:52
136
原创 杭电1102——最小生成树+并差集
kruskal 配并差集模板题#include <iostream>#include <algorithm>#include <cstring>#include <cmath>using namespace std;const int mx = 105;//存储节点上级int f[mx];//存储两节点之间的距离struct node { int a, b; double val;};//计算两个节点之间的距离doubl
2020-10-27 16:33:39
112
原创 杭电1162——最小生成树+并差集
kruskal配合并差集模板题#include <iostream>#include <algorithm>#include <cstring>#include <cmath>using namespace std;const int mx = 105;//存储节点上级int f[mx];//存储两节点之间的距离struct node { int a, b; double val;};//计算两个节点之间的距离doubl
2020-10-27 16:17:47
134
原创 杭电1875——最小生成树+并差集
最小生成树模板题,使用 kruskal 配合并差集做#include <iostream>#include <algorithm>#include <cstring>#include <cmath>using namespace std;const int mx = 105;//存储节点上级int f[mx];//存储两节点之间的距离struct node { int a, b; double val;};//计算两个节点之
2020-10-27 12:54:59
145
原创 杭电1233——最小生成树+并差集
算是最小生成树的模板题吧最小生成树算法有 prim 和 kruskal 两个我一般会用kruskal,好理解,代码好写kruskal会用到并差集,很经典的算法#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;int f[105];//记录父亲节点int r[105];//记录深度struct nod
2020-10-26 21:11:50
175
原创 LeetCode1365. 有多少小于当前数字的数字
//1365. 有多少小于当前数字的数字//新创建一个数组等于原数组//对新数组排序//然后二分查找class Solution {public: vector<int> smallerNumbersThanCurrent(vector<int>& nums) { auto s = nums; sort(s.begin(), s.end()); vector<int>ans; for (auto x : nums)
2020-10-26 20:59:11
112
原创 LeetCode238. 除自身以外数组的乘积
//238. 除自身以外数组的乘积/* * 1、暴力做法 * 创建两个数组,一个用于记录前缀乘积,一个记录后缀乘积 * 最后直接将两个数组对应的数字乘起来就是答案 * 时间:3n -> n * 解释:记录前缀和后缀分别需要 n * 遍历每个节点又需要 n * 加起来就是 3*n * 空间:2n -> n * 解释:除了返回的数组,多用了两个具有n个元素的数组 * 所以是 2*n */class Solution {public: ve
2020-10-25 13:32:00
109
原创 LeetCode1450. 在既定时间做作业的学生人数
//1450. 在既定时间做作业的学生人数// 直接判断queryTime在不在每个区间里面就可以了// 如果问很多次// 就需要用分块或者线段树来做了class Solution {public: int busyStudent(vector<int>& startTime, vector<int>& endTime, int queryTime) { int cnt = 0; for (int i = 0; i < startT
2020-10-25 13:07:56
176
原创 LeetCode443. 压缩字符串
//845. 数组中的最长山脉/* * 使用双指针,i:指向赋值的地方、j:指向遍历的位置 * 使用j遍历数组,同时计数 * 每次遇到与上一个字符不同的地方,就在i的地方开始赋值 * 为了方便处理,可以在原数组的最后加一个数组中不可能出现的字符,这样不用特判最后位置 * 最后返回i就行 */class Solution {public: int compress(vector<char>& chars) { chars.emplace_back(0);
2020-10-25 11:20:54
135
原创 LeetCode845. 数组中的最长山脉
//845. 数组中的最长山脉/* * 遍历数组,找到每个山顶,即:此元素比相邻两个元素的值都要大 * 针对每个山顶,去找左边的界限(从左到右递增),找右边的界限(从左到右递减) * 时间复杂度:O(n) * 解释:1、遍历每个节点是n, * 针对每个节点,遍历他的边界,整体来看,总的是n * 换个思路: * 2、针对每个节点,最多只会被遍历两遍 * -山顶只会在最外面的循环中遍历一遍 * -其他节点只能属于其中某个山,内部循
2020-10-25 10:41:16
106
原创 LeetCode109. 有序链表转换二叉搜索树
//109. 有序链表转换二叉搜索树/** 1、暴力做法:* 先把链表转成数组* 然后二分(dfs)遍历整个数组* 过程中建立链表* 时间复杂度:n* 空间复杂度:n* 2、快慢指针:* 使用快慢指针找到链表的中间节点* 然后用同样的方法处理两部分的链表:这种方式好像叫分治* 时间复杂度:nlog(n)* 空间复杂度:应该是常数,但是我看官方题解说的是log(n)* 3、bfs建树,dfs赋值* 先用bfs的方法把树创建出来,* 然后
2020-10-24 22:31:07
99
原创 LeetCode700. 二叉搜索树中的搜索
//700. 二叉搜索树中的搜索//简单地dfsclass Solution {public: TreeNode* searchBST(TreeNode* root, int val) { if (root == NULL) return NULL; if (root->val == val) return root; else if (root->val > val) return searchBST(root->left, val); e
2020-10-24 21:06:18
69
原创 LeetCode1252. 奇数值单元格的数目
//1252. 奇数值单元格的数目/** 1、暴力做法:直接创建一个 n*m 的矩阵,然后模拟,最后遍历矩阵,计数* 复杂度:(m+n)*indices.length+m*n -> 12500* 代码就不放了* 2、巧妙,但是复杂度比较高的方法:* 针对矩阵中的每个元素坐标,他最后的数字=自己的坐标在坐标数组中出现了多少次来决定的* 比如说:坐标数组有:[1,1] [2,1]* 1)那么[0,1]的0在坐标数组的横坐标中出现了0次,1在坐标数组的纵坐标中出现了2次
2020-10-24 16:37:42
115
原创 LeetCode1024. 视频拼接
//1024. 视频拼接/*1、先将没用的删除 1)比如:[1,10],[1,3] 2)比如:[1,10],[2,4] 上面两种,可以这样删除 1)将原数组排序,排序依据为: 判断起始是否相等 -相等:以差值降序排列 -不等:以起始位置升序排列 排序之后的例子: [0,10] [0,7] [0,2] [1,7] [1,3] [2,1
2020-10-24 15:57:33
246
原创 LeetCode1609. 奇偶树
//1609. 奇偶树//使用队列实现bfs,每层特判一下就可以,相对简单class Solution {public: bool isEvenOddTree(TreeNode* root) { if (root == nullptr) return true; queue<TreeNode*>que; que.push(root); int vis = 1; while (que.size()) { int cnt = que.si
2020-10-23 20:48:58
144
原创 LeetCode172. 阶乘后的零
//172. 阶乘后的零/*问题转换:原问题:n!中尾数零的个数可化为:n!中10的个数可化为:n!分解质因数之后,2和5个数的最小值因为两个数就会有一个2,五个数才有一个5,所以5的个数一定比2的个数小所以可化为:n!分解质因数之后,5的个数n!有多少个质因数5, 即n可以划分成多少组5个数字一组, 加上划分成多少组25个数字一组, 加上划分多少组成125个数字一组, 等等。即Ans = n / 5 + n / (5 ^ 2) + n/ (5 ^ 3) + ...以上推
2020-10-23 20:25:04
81
原创 LeetCode234. 回文链表
//234. 回文链表/*可以使用栈等方法,但是题目说最好不要使用额外的空间1、容易理解的方法: 先使用双指针找到中间节点:第一个while 然后将前半部分链表翻转:第二个while 最后使用双指针同时遍历两部分链表:第三个while2、可能更快一点,但是比较复杂的方法: 在找中间节点的同时,将前半部分链表翻转 最后同时遍历*/class Solution {public: bool isPalindrome(ListNode* head) { ListNode
2020-10-23 18:17:50
75
原创 C++重载、重写和重定义
重载拥有相同的函数名字,但是参数类型、个数等其他因素不同的表现形式是两种函数同时存在重写(覆盖)子类重新写了一个函数,与父类的一个函数具有相同的函数名、参数列表等父类函数需加 virtual 关键字两种函数,但是不会同时存在。隐藏与重写相同,但是父类函数没有 virtual 关键字...
2020-10-22 18:17:10
166
原创 C++三大特性
三大特性:继承、封装、多态本人通俗的理解继承一种class拥有另一种类的全部特点和操作(在public下)封装将一些客观的东西写成一个class,其中包括1、这种东西的一些特点,class的成员变量2、这种东西的一些操作,class的成员函数多态通过继承和虚函数实现一个对象的成员函数在不同的场景调用的实际函数是不同的简单说就是表面上调用的函数名字是一样的,但是实际上进行的操作是不一样的有空再继续补充...
2020-10-22 18:09:05
135
原创 LeetCode763. 划分字母区间
//763. 划分字母区间//简单的合并区间class Solution {public: vector<int> partitionLabels(string S) { int n = S.size(); vector<int> num[26]; for (int i = 0; i < n; i++) { num[S[i] - 'a'].emplace_back(i); } vector<pair<in
2020-10-22 16:22:32
119
原创 LeetCode628. 三个数的最大乘积
//628. 三个数的最大乘积//将数组排序:【a, b, , , , , c, d, e】//答案就是:max(a* b, c* d)* e;class Solution {public: int maximumProduct(vector<int>& nums) { int n = nums.size(); sort(nums.begin(), nums.end()); return max(nums[0] * nums[1], nums[n -
2020-10-21 17:48:41
80
原创 LeetCode剑指 Offer 66. 构建乘积数组
//剑指 Offer 66. 构建乘积数组//维护两个数组:l,r//l[i]:原数组左边所有元素的乘积//r[i]:原数组右边所有元素的乘积//这样,ans[i]就等于l[i] * r[i]class Solution {public: vector<int> constructArr(vector<int>& a) { int n = a.size(); vector<int>l(n, 1); vector<int
2020-10-21 17:38:32
91
原创 LeetCode925. 长按键入
//925. 长按键入//转换成这样一个问题:typed能不能由name变换而来//使用双指针(i,j)遍历两个字符串//如果对应的字符相同,都加一//如果不同,就要看name[i-1]是否等于typed[j]// 如果相同,j加一// 如果不同,直接返回false//最后需要判断,name是否全部遍历了class Solution {public: bool isLongPressedName(string name, string typed) {
2020-10-21 17:11:17
173
原创 LeetCode344. 反转字符串
//344. 反转字符串//遍历原字符串的一半,与对应的字符交换//不申请额外的空间class Solution {public: void reverseString(vector<char>& s) { int n = s.size(); for (int i = 0; i < n / 2; i++) { swap(s[i], s[n - i - 1]); } }};...
2020-10-21 16:48:05
74
原创 LeetCode1624. 两个相同字符之间的最长子字符串
//1624. 两个相同字符之间的最长子字符串//遍历原字符串,记录26种字母出现的位置//遍历每种字母出现的位置,计算差值:最后一个位置减去第一个位置//更新答案class Solution {public: int maxLengthBetweenEqualCharacters(string s) { vector<int> a[26]; for (int i = 0; i < s.size(); i++) a[s[i] - 'a'].empl
2020-10-21 16:41:20
217
原创 LeetCode25. K 个一组翻转链表
//25. K 个一组翻转链表class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode* ans = new ListNode(-1); ans->next = NULL; auto end = ans; auto p = head; int cnt = 0; while (p != NULL) { auto t = p;
2020-10-07 15:06:26
72
原创 LeetCode198. 打家劫舍
//198. 打家劫舍//算是dp吧,f[i]代表:最后一步走到i的答案//因为不能相邻,f[i]的状态是由f[i-2],f[i-3]来维护class Solution {public: int rob(vector<int>& s) { int n = s.size(); if (n == 0) return 0; if (n == 1) return s[0]; if (n == 2) return max(s[0], s[1]);
2020-10-02 11:22:50
61
原创 LeetCode42. 接雨水
//42. 接雨水//一列一列的算//针对每一列,要看左边柱子中最高的和右边柱子中最高的//取这两根最低的那个,然后减去自身柱子的长度,就是自身这一列的水//先遍历两遍,算出每列左边最高的柱子和右边最高的柱子//复杂度3*nclass Solution {public: int trap(vector<int>& height) { auto l_max(height); auto r_max(height); for (int i = 1; i
2020-10-01 15:54:32
85
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人