- 博客(31)
- 收藏
- 关注
原创 docker安装
从中任选几个源加入Docker Engine, 操作步骤如下。加入后,点击右下角Apply &restart重启即可。1. 下载dockerdesktop安装包。2. 安装好后,设置镜像源。
2023-10-14 15:11:10
85
原创 突然刷到了当时面试ks的面试题,就小记一下吧
这题其实理解了也就不难,就是在遍历所有元素的过程中高位池一个小根堆。每次遍历到一个新元素的时候,先判断队中元素个数是否小于k,若小于,则插入堆,否则就和堆顶元素比较。若大于堆顶元素,则先将堆顶元素pop,再插入新元素。为了练习一下堆的写法,就不用stl的priority_que啦。class Solution {protected: void exchange(int &a, int &b){ int t = a; a= b; .
2022-05-19 21:44:09
309
原创 今日打卡一道数学题(中位数的性质)
今天就打卡一道数学题吧:用到了中位数到各个数字距离之和最小的特点class Solution {public: int minMoves2(vector<int>& nums) { sort(nums.begin(), nums.end(), less<int>()); int ans=0, n = nums.size(); int t = n>>1; for(int i=0;i<.
2022-05-19 20:28:32
194
原创 原地哈希表
今天刷到一个很特别的题目要我们再常数级别的空间复杂度内解决。所以很明显不能额外做个哈希表。但是根据题目给出的数据范围以及数组长度来看。再原来的数组上就可以进行哈希。不过需要一些奇淫技巧。1.假设遍历到了num[i]。那我们就再num[abs(num[i])-1]处对原来的数取反。然后每次遍历到一个新的数据的时候。我们判断这个数取绝对值减一对应的下标对应的元素是否为负数。若为负数,说明之前遍历到了代码如下class Solution {public: vector<int>
2022-05-08 19:26:21
183
原创 一道非常经典的前缀异或题
今天刷到一道题,可谓是将异或的性质利用到了极致请看题解这道题我们需要用到异或的两个性质1. x*x = 02. 0^x = x;所以要求数组中下标i到j的异或为arr[i]……arr[j]=(arr[0]……arr[i-1]) ^ (arr[0]……arr[i-1]) ^ (arr[i]……arr[j]);即:原式=(arr[0]^……^arr[i-1]) ^ (arr[0]^…………^arr[j]);假设:前缀和数组xors。xors[i+1]表示arr[0]……arr[i]。那么易
2022-05-07 00:04:28
458
原创 约瑟夫环问题
约瑟夫环是一个经典的递归问题。以前没有太过于注意,今天刷到了,竟然没有想到递归的解法,只想到模拟的解法,故提笔记之题目如下第一种解法。模拟用一个标记数组标记已经淘汰掉的小伙伴,知道剩余一位class Solution {public: int findTheWinner(int n, int k) { vector<int> tags(n, 0); /*将1-n编号为0-n-1*/ int start = 0;
2022-05-04 16:25:41
816
原创 滑动窗口妙题:leetCode992
题目如下:这道题最妙的地方在于:我们要求的不同整数恰好为k的子数组的个数等于不同整数最多为k的子数组个数减去不同整数最多为k-1的子数组的个数。所以我们先实现求解不同整数个数最多为k的子数组个数的函数f(k)。最后结果就是f(k)-f(k-1)代码如下class Solution {public: //不同整数的个数最多为k的子数组的个数 int f(vector<int>& nums, int k){ if(k==0){
2022-05-03 16:11:55
282
原创 新学到的知识点:前缀和+差分的妙用
今天刷到一个题。典型的前缀和+差分解法的题。简直妙不可言,故提笔记之题目如下这是一道很典型的对n个区间进行增量。若是我们用暴力法的话,那事件复杂度将会是n*m。而区间问题恰好是差分所能解决的领域。而且差分的前缀和就是原数组。所以我们可以将这个题分成两步初始化差分数组对差分数组求前缀和,得到原数组代码如下:class Solution {public: vector<int> corpFlightBookings(vector<vector<int>&
2022-05-03 16:05:32
170
原创 前缀和(一道技巧性巨强的题目)
今天又刷了一道巨棒巨棒的题目请看题题目很啰嗦,其实就是要我们求出给定字符串中固定连续字串的个数。连续字串例如abc或者xyzabc都属于连续字串。如果我们用暴力解法的话,那时间复杂度为n^2肯定是不通过的举个例子比如连续字符串:abcd连续子串长度为4的个数:1连续子串长度为3的个数:2连续子串长度为2的个数:3连续子串长度为1的个数:4所以字串个数为1+2+3+4。根据这个规律我们可以发现,我们只需要利用滑动窗口就可以算出一个随机字符串的所有的连续字串的个数了。另外一个问题又来了
2022-04-29 00:11:37
271
原创 今天刷了一道非常好的dp题(位运算状态压缩)
请看题此题有两个难点状态不好找,两个人轮流取数,取出的数字不放回,我们很容易被两个人取数给绕晕,其实我们只要关心第一个取数的人胜利就行,当第一个人取数时,若取出的数大于等于desiredToal,那么胜利,否则转移到下一个状态,即另外一个人取数的状态。我们可以知道,上一个人胜利的条件是下一个人失败。所以状态转移方程就很容易出来了。如何保存状态取值。我们观察可以发现,随着每次取出数字。剩余的数字在减少。恰好取出的数字能够标志当前状态。比如之前取出2,3,1和之前取出3,1,2对接下来的结果的影
2022-04-27 23:57:06
96
原创 leetCode368(动态规划)
今天这道动态规划的解法,其实以前是做过类似的,和最长递增子序列的解法类似,但是我却还是不会做,怎是该打题目如下众所周知,动态规划最重要的莫过于找到动态转移方程了。这个题目也一样。我们发现最终要找到的是最长有效集合。而对于这个集合种有两个比较特殊的数,一个是最大值,一个是最小值。假设我们有一个最大值为k的有效集合,我们依次把k+1,k+2…k+n加进去。每次加入的时候,我们其实只要判断一下当前加入的数是否能整除集合中的最大值,如果能,则加入,状态转移成功到k+1。据此,我们可以判断出只要通过集合中的最
2022-04-26 14:15:00
628
原创 leetCode313超级丑数(动态规划)
请看题根据题目的意思我们很容易发现。每一个新的丑数都是等于前面的某个丑数乘以对应的质因子得到的。这就是状态转移的过程,仔细想想,我们该怎样才能知道是用前面哪个丑数乘以哪个质因子呢。先用一个例子分析一下:质因子为primers = [2,3,17,19],第一个丑数f(0) = 1,第二个丑数:f(1) = min(f(0)*primers[0]…primerrs[3])=2。第二个丑数用到的是f(0)乘以第一个因子得到f(1)。所以第三个丑数f(2) = min(f(0)*primers[1]
2022-04-25 23:30:17
163
原创 leetCode587(凸包问题)
今天又学了一种新算法,主要是编程求解平面集合问题题目描述如下这个题目用到的算法我们称之为凸包算法,有很多种,单核心思想都是从一个点出发,找到以出发点开始最左或者最右的一条边。利用的是向量的叉乘的大小找到下一个点的位置 /*关键思想:利用向量的叉乘来判断点的位置*/ int cross(vector<int> &p, vector<int> &q, vector<int> &r){ return (q[0]-p
2022-04-23 23:58:48
336
原创 leetCode396(一道比较好的dp题)
今天刷到一道dp题目,需要用数学方法退出递推式来,然后根据递推式动态规划的一道题,虽然不难,但是我我觉得很有意义。因为在得出递推式后,根据递推式写的代码一遍通过!!!题目如下代码就简单贴一下吧class Solution {public: int maxRotateFunction(vector<int>& nums) { /*动态规划递推式:F(k) = F(k-1) + sum(nums[0]...nums[n-1]) - n*nums[n-k]*/
2022-04-22 23:43:32
207
原创 leetCode309(动态规划)
今天刷到一道状态分析把我搞的稀里糊涂的题目,故提笔记之题目如下思路如下首先对其状态进行分析。在任意一天结束时,只可能有三种状态手里有一支股票手里没股票,在这天结束后处于冷冻期手里没股票,这天结束后也不处于冷冻期间然后我们对这三个状态进行分析。判断他们需要从哪个状态转移过来。然后对其进行编程即可。重点来了:这状态转移分析弄得我脑子一团浆糊。。。首先对状态1分析:当天结束后,手里有一支股票,那么有两种可能,是由前一天结束手里有一支股票的状态转移过来或者前一天结束手里没股票然后在今天买
2022-04-19 17:19:46
673
原创 leetCode131(动态规划+回溯)
今天刷动态规划模块时,刷到一道很有意思的题,这道题主要解法是回溯,但是可以先用动态规划进行预处理来优化题目如下这道题目我们初看可能并没有啥思路,但是如果我们模拟去分割的时候,我们可以发现,整个过程可以抽象成一棵树例如对aab进行分割整体思路为当我们分割的时候我们要判断割出来的是不是回文串,若不是,这种情况我们就应该舍弃,不能再继续。若是回文子串,我们将进行下一此切割所以其实这就是一个通过dfs实现的回溯算法。但是,我们还能在判断回文串上进行优化。假设在长度为n的字符串上。我们要判断字串
2022-04-18 12:00:07
406
原创 (leetCode 222)二叉树与位运算的关系&二分法模板
今天刷到一个题我感觉收获真是太大了题目如下关键点1:位运算与二叉树结合这个题目最传统的做法,就是递归统计节点数目,最后时间复杂度为O(n)。但是题目给出条件是完全二叉树,这样我们就可以利用平衡二叉树的性质来优化了首先观察我们可以发现我们要求的是最后一层的最后一个节点的值,我们可以很容易得到树的左边和右边的高度,这样就能把最后一个节点的之确定在这个范围里。然后再通过二分法不断缩小范围。关键在于,我们如何确定一个值是否再这颗树上这就是核心思想了,二叉树和二进制位运算的关系。我们可以发现,根节点是n
2022-04-15 10:57:35
814
原创 leetCode211(字典树)
今天刷到一个题,要我们设计一个数据结构能够快速匹配字符串的数据结构。也就是大名鼎鼎的字典树。也可以叫做前缀匹配树。像路由器对分组的ip与路由表项匹配的时候用的数据结构就是这个。还是蛮重要的,故提笔记之下面请看题思路:像这个题,我们需要设计的字典树的度为26(因为有26个字母)。树上每个节点到根的路径是唯一的,故都可以代表一个字符串。因为有的时候我们插入的字符串可能是已经插入的字符串的子串,所以我们需要在每个节点里面设置一个布尔字段is_end.表示是否有以当前节点结尾的字符串。这样我们每次插入字符
2022-04-15 00:35:43
192
原创 二叉树前、中、后序遍历的非递归形式
今天复习了一下二叉树前中后遍历的非递归形式,感觉还是蛮有意思的。并且有一定的规律,故提笔记之。1. 前序遍历 vector<int> preorderTraversal(TreeNode* root) { vector<TreeNode *> st; vector<int> res; TreeNode *cur = root; while(!st.empty() || cur!=nullptr){
2022-04-13 23:40:55
229
原创 leetCode124(二叉树的最大路径和)
题目如下这题乍一看,我是没有想到啥好思路的。最后忍不住看了下题解。忍不住赞叹了一句,妙呀!!解法:其实思路也不难。我们要站在根节点的角度思考问题。我们要从左右节点中获得什么信息,才能得到最终结果。很明显我们最终的路径应该是一条类似倒v形的路径。而倒v的根节点我们开始是不能确定的。这是所有可能结果中取最大值的情况。假设我们现在再某个节点。我们只要知道以左节点为出发向下和以右节点出发向下所经历的路径的最大值。我们就可以得到两个信息,一个是以当前节点出发向下得到的单挑路径的最大值和以当前节点为倒V的根节点的
2022-04-12 23:04:56
158
原创 leetCode117(一题双解)
今天刷到一道二叉树的题目。题目如下首先有一个解法是很容易想到的,那就是bfs遍历,然后将每一层的节点连接起来。代码如下class Solution {public: Node* connect(Node* root) { if(root==NULL){ return root; } queue<Node *> st; st.push(root); while(!st.empt
2022-04-12 21:54:16
359
原创 leetCode780(反向分析)
今天刷到一道比较有意思的题,请看题乍一看我立马想到了DFS+剪枝。如是乎有了以下代码 struct node{ pair<int,int> pos; int tag; }; bool reachingPoints(int sx, int sy, int tx, int ty) { //dfs+剪枝 vector<node> st; //标记数组,防止重复 set<
2022-04-11 23:15:18
80
原创 leetCode307:线段树解法
今天做到一个题目,看起来很简单很简单,但是O(n)的复杂度都超时了题目如下正确的思路是利用线段树。加入给我们一个长度为n的数组,我们可以将n个元素的和均分到一颗二叉树上,假设二叉树的节点层序遍历为0,1,2,3,4…。我们可以用一个数组来存储这颗树。根节点0保存0到n-1内的元素值之和。m=0+(0+n-1)/2。0的左节点为1保存0到m内的元素值之和,0的右节点2保存m+1到n-1内元素值之和。再分别对1和2之两个节点划分。直到最后节点保存的只有一个元素为止。代码如下class NumArray
2022-04-05 00:52:51
962
原创 leetCode209
今天刷到一道题,有两种解法:滑动窗口和二分法。同时学到了C++中的一个简化二分的函数low_bound()请看题给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长
2022-04-03 22:28:50
52
原创 leetCode刷题打卡
今天刷到的这个题没用到啥经典的算法。主要思路就是找对子,用到的数据结构为哈希表代码如下class Solution {public: bool canReorderDoubled(vector<int>& arr) { unordered_map<int,int> elem_cnt; for(int &e: arr){ elem_cnt[e]++; } vector
2022-04-01 23:23:55
235
原创 刷题打卡:leetCode22(回溯法、动态规划法)
今天刷到一道题,共有回溯法,动态规划两种解法,感觉蛮有意思的题目: 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8解法一:回溯法 //回溯法 /** * @brief 回溯法解题 * 思路:一步
2022-03-30 13:37:59
528
原创 刷题打卡:leetCode2024(滑动窗口)
题目大致意思说:给一个长度为n的字符串,里面只包含T和F,在能最多能修改k个字符的情况下,求修改后字符串最大连续字串的长度示例一输入:answerKey = “TTFF”, k = 2输出:4解释:我们可以将两个 ‘F’ 都变为 ‘T’ ,得到 answerKey = “TTTT” 。总共有四个连续的 ‘T’示例二输入:answerKey = “TFFT”, k = 1输出:3解释:我们可以将最前面的 ‘T’ 换成 ‘F’ ,得到 answerKey = “FFFT” 。或者,我们
2022-03-29 11:05:49
203
原创 C/C++编译器优化所带来的bug
关于C/C++编译器的默认优化以及volatile关键字的使用今天刷题,由于自己的粗心,讲赋值号写成==了,导致编译器把某段代码优化,而出了一个很诡异的bug,故提笔记之请看代码for(int len=1;len<=n;len++){ for(int i=0;i<=n-len;i++){ if(1==len){ tags[i][i]==1; }else if(l
2022-03-29 00:06:34
1422
原创 n!后缀0个数
leetcode172阶乘后的0题目描述如下给定一个整数 n ,返回 n! 结果中尾随零的数量。提示 n! = n * (n - 1) * (n - 2) * … * 3 * 2 * 1示例1输入:n = 3输出:0解释:3! = 6 ,不含尾随 0示例二输入:n = 5输出:1解释:5! = 120 ,有一个尾随 0解题思路我们要看最终结果有多少个后缀0,其实就是看这些乘数有多少个10的因子,而10可以拆成2和5两个质因数。2的数目一定比5多(这还是蛮容易证明的),所
2022-03-26 23:07:45
281
原创 字典树思想
今天刷了一道很有意思的题,leetCode404题目给出的描述如下刚开始看的时候,感觉毫无头绪,因为不太懂字典序是个啥。后来battle了好久,终于还是忍不住去看了看题解,才发现,字典序原来就是按照字符串的规则去排序呀!思路如下:我们取1-n中的任意一个数v。我们可以发现。按照字典序来的话。它下一个数应当是v*10(如果v*10小于等于n的话),反之则为v+1。 下下个数为v*10*10(如果v*10*10小于等于n的话)。根据这个规律我们很明显可以想到度为10的完全树中,根节点和它的最左边
2022-03-23 11:57:42
552
原创 leetCode刷题记录
第一次发博客,主要目的还是当笔记用吧lettCode2039题题目大致要求是给一张图,两两节点之间的连接长度为1.要我们求出从一个节点到其他节点的所有距离。着我首先想到的是迪杰斯塔拉的,但是这个时间复杂度是n^2的,所以最后超时了。标准题解是用的BFS。大致思路是从源点开始,一层层的遍历所有的节点。第i层的节点到源点的距离就是i。这样找出所有节点到源点的距离。然后根据这个距离算出题目中要求的“最短时间"主要过程有两步骤1、将题目给出的边转换成邻接表(以二维数组的形式,用vector<.
2022-03-21 19:28:30
1300
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人