自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 剑指 Offer II 116. 省份数量【并查集】

题目思路找关系的题目使用并查集都可以很快解决所谓并查集,就是有并与查两个操作的集合,维护一个parent数组在初始化时,将节点的parent设置为它自己并操作的时候,将两个节点的父节点合并(将其中一个节点的父节点的父节点设置为另一个节点的父节点)查操作的时候,当parent[x]==x时,就是找到了根节点,同时我们还可以进行路径压缩:即在找当前节点的父节点时,将这个节点的父节点设置为它的父节点的父节点。##代码:class Solution {public: int find(

2022-03-30 21:06:09 447 1

原创 平分物品【DFS】

题目思路对于每一件物品,一共有三种选择:1、给A2、给B3、丢弃采用DFS记录所有的选择。使用res记录要丢弃的物品价值出递归的条件是所有的物品都进行了选择,所有的物品都进行选择之后如果sum1==sum2,则说明分配到了两个人手里的物品价值一致,记录此时的最小res即可。代码中sum表示全部物品的和,sum1表示给A的物品,sum2表示给B的物品代码:#include <bits/stdc++.h>#define ll long longusing namespace

2022-03-25 20:19:28 438

原创 LeetCode刷题笔记——41. 缺失的第一个正数

题目思路遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标就是答案,否则遍历完都没出现那么答案就是数组长度加1。需要注意的是,交换时,有可能一次交换并不到位,比如3,4,-1,1,第一次交换后为,-1,3,4,1,此时对-1进行判断,若该位置的数符号交换条件(大于等于1,小于等于n,且此数不在它本来的位置,即nums[i]!=i+1),需要一直交换,而面对交换位置的两个数相等的情况下,就跳出此次while,即这两个相等的数只

2022-03-15 16:26:03 1452

原创 Leetcode刷题笔记——全排列问题【dfs+回溯】

题目https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/思路全排列问题,使用dfs+回溯思想,注意剪枝首先看单纯的全排列问题:题目链接:https://leetcode-cn.com/problems/permutations/解题:https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw...

2022-03-05 22:27:37 167

原创 Leetcode刷题笔记——剑指 Offer 41. 数据流中的中位数【优先队列】

题目思路本题难点就是需要对自定义的数据结构每加一个元素,就排序放入数据结构中,并且还需要高效地访问数据结构中的中间元素(特定顺序元素,而非顺序访问)对于自动排序,C++中的优先队列可以实现优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的其基本操作如下:priority_queue <int,vector<int>,greater<int> > pq_greater;//大顶堆,里面的元素从大到小排序prio

2022-03-03 18:11:34 772

原创 Leetcode刷题笔记——122. 买卖股票的最佳时机 II【DP】

题目思路显然采用DP,难点在于状态转移方程每天最多只允许持有一支股票,即每天的状态只可能是持有一支股票或未持有,用DP[n][2]记录每天的最大利益,其中dp[i][0]表示第i天未持有股票的最大收益,dp[i][1]表示第i天持有股票的最大收益。则有,未持有股票时,可能是i-1天就未持有,也可能是第i天卖出去了持有股票时,可能是i-1天就持有了,也可能是第i天买的:显然其边界为dp[0][0]=0,dp[0][1]=-prices[0]。应该从小到大计算收益代码class Solu

2022-03-02 19:55:02 421

原创 Leetcode刷题笔记——剑指 Offer 36. 二叉搜索树与双向链表【DFS+中序遍历】

题目思路显然这是一题中序遍历题,难点就是需要在中序遍历的时候处理前一个节点与当前的节点形成双向链表我们可以用一个pre指针指向前一个节点,一开始的时候这个pre是空的,当我们找到最左边的节点时,判断pre是否为空,如果为空说明这是head节点,用head记录下来,否则说明pre指向了前一个节点,可以令pre->right = curptr,curptr->left = pre形成双向链表。代码/*// Definition for a Node.class Node {pub

2022-03-02 11:49:08 254

原创 Leetcode刷题笔记——剑指 Offer 34. 二叉树中和为某一值的路径【DFS】

题目思路显然这是一道DFS+回溯题,在DFS中加回溯需要在递归函数中维护一个外部变量,该变量用于记录递归信息,对该变量的回溯一般放在DFS函数的尾部,在到达递归的最深处开始回溯外部变量。DFS与回溯代码模板:type function(){vector<vector<int>> res; //用于记录结果vector<int> path; // 用于记录递归信息if(正常运行的条件){ dfs(一般传入数、vector等,传入记录递归的变量,传入记录结果

2022-03-01 20:59:57 240

原创 Leetcode刷题笔记——剑指 Offer 47. 礼物的最大价值【DP】

题目思路明显的DP题,记忆化搜索。采用贪心会陷入局部最优。我们需要采用一个二维数组dp[i][j]用于保存i,j这个位置的礼物最大价值,那么对于位置m,n而言,到达它的位置的礼物最大价值要么是从m-1,n过来的,要么是从m,n-1过来的。只需要比较这两个位置的礼物的最大价值,选择较大的那个位置,再加上当前m,n这个位置的礼物价值,就是状态转移方程。dp[i][j]=max{dp[i-1][j],d[i][j-1]}+grid[i][j].其边界条件为左边第一列与上面第一行,因为走到左下角和右上

2022-02-24 16:55:12 290

原创 Leetcode刷题笔记——7.整数反转

题目思路反转不难,不停对10取余再除10就行,本题的难点在于反转后超过32位整数的范围如何处理。在C++中如果一个int类型的数超过32位就要用long或long long来保存,如果int超过32位,在对它进行强制类型转换的时候,该数就不会是原来的数值,利用这点进行判断,如果将long类型强制类型转换后不等于原来的int数,说明转换后超出范围,直接返回0代码class Solution {public: int reverse(int x) { long n=0;

2022-02-18 17:38:13 379

原创 Leetcode刷题笔记——1995. 统计特殊四元组【哈希表的应用】

题目思路a+b+c=d可以转化为a+b=d-c,且a<b<c<d,那么可以将数组分为两部分,右边部分为cd,左边部分为ab。取一条分界线,该分界线位于右侧倒数第二个元素前,即意味着此时cd都只有一个选择,固定c为分界线的后一个元素,则d在c+1~n之间遍历,b在c-1~1之间遍历,a在1~b之间遍历。用哈希表存下nums[d]-nums[c]出现的次数,随后在左侧遍历时统计nums[a]+nums[b]出现的次数,将此次数累加即可得到结果代码class Solution {

2021-12-29 20:25:52 313

原创 2021年全国计算机能力挑战赛C++决赛,题目分享

心得比赛一共5道题,比赛时间2小时。需要写代码非常快,尽量少有卡顿,一般而言有三题比较简单,这三题中有一题比较繁琐(代码量较大)。剩余有两题有一定的难度,仔细解一题应该是没问题的,剩余一题有经验的大佬应该是可以拿下的。需要注意的是题目顺序并不是先简单后容易,所以看题目遇到没有思路的题目应该跳过做下一题,最后再回来解。题目1题目2题目3题目4题目5题目5的测试用例为:最后因为我参加这个比赛的时候发现网上的往年题目较少,有的人只贴出了代码没有题目,有的人贴了题目与代码但是代码多

2021-12-27 09:39:55 6865 8

原创 Leetcode刷题笔记——54. 螺旋矩阵【模拟】

题目思路通过模拟可以发现,每次转角的时候都是遍历完成一条边,所以我们可以确定四条边界,每遍历完一条边,边界就移动一次,直到上边界不再大于下边界或者左边界不再小于右边界(此时说明该矩阵在一个方向上已经遍历完了),则退出循环。难点是分清楚边界,分清楚每个方向的循环条件,仔细模拟就可以解决。代码class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) {

2021-12-22 22:02:49 702

原创 Leetcode刷题笔记——904. 水果成篮【哈希表、滑动窗口】

题目思路理解完题目即可发现,这题的本质是要求数组中的最长连续子数组长度,不同的是这个连续子数组可以拥有两个不同的元素。由于存在不同的元素,首先可以想到用哈希表记录子数组不同元素的出现次数,该哈希表的长度应该不超过2,一旦超过2说明出现了第3种元素,需要将之前出现的2种元素中的任意一种剔除出去,这种右侧向右扩展,出现意外需要左侧运动的思路很容易想到滑动窗口。滑动窗口模板代码:int left=0;int len=0,res=0;for(int i=0;i<nums.size();i++){

2021-12-21 20:16:54 326

原创 Leetcode刷题笔记——209. 长度最小的子数组【滑动窗口(动态)】

题目思路首先就想到滑动窗口,这题用常规的滑动窗口能做,但是效率不高。图片思路来自代码随想录(https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html#%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3)采用动态的滑动窗口,即滑动窗口找到窗口内的内容符合条件时,窗口从左侧开始缩小,每缩小一次判断一次是否还符合条件,若符

2021-12-20 20:59:52 220

原创 Leetcode刷题笔记——50. Pow(x, n)【快速幂算法】

题目思路在这题中,n可能很大(指数爆炸),如果就简单采用for循环计算量太大,由于计算量大而时间耗费长。因此需要降低n,以减少计算量,最常用的算法即快速幂算法。所谓快速幂,其核心思想是计算2^9时,可以这样计算:1、计算2*(2*2)*(2*2)*(2*2)*(2*2)2、计算2*(4*4)*(4*4)3、计算2*(16)*(16)4、计算2*(256)这样做有两个好处,一是不需要乘8次,降低时间复杂度,二是存在很多冗余计算,2x2时只需要计算一次,剩余的乘法都是2x2,即此时已经变成

2021-12-06 21:24:54 278

原创 Leetcode刷题笔记——506. 相对名次【hashmap】

题目思路本题实质上就是考排序,不过是排好序之后要所有元素记得原来的位置。那么只要排好序之后用hashmap存下当前排好序的元素与排序的联系即可(即用hashmap建立元素与排名之间的联系)复制一下score数组,对原数组进行排序,排好序后用hashmap记录元素与排序之间的关系,再根据原数组的元素找到hashmap对应的排名,即可。hashmapunordered_map<int, string> order; %此hashmap为int元素与string元素之间的映射关系代码

2021-12-02 21:21:46 344

原创 Leetcode刷题笔记——384. 打乱数组【洗牌算法】

题目思路对于构造函数以及reset函数比较简单,可以用一个类的私有变量保存下Nums(在构造函数中保存),每次调用reset()时将这个私有变量再赋值出去。对于shuffle(),要求等概率返回某个方案,或者说每个元素都等概率出现在每个位置中。可以使用Knuth 洗牌算法 ,在O(n)的复杂度内等概率地返回某个方案。简单地说就是将数组分为两部分,一部分是完成随机的,一部分是原始数组。循环选择i,从[i,size()-1]中随机选择一个数与nums[i]交换,此时nums[i]就归属于完成随机的部

2021-11-22 19:32:02 675

原创 Leetcode刷题笔记——120. 三角形最小路径和【DP】

题目思路显然,第i层的最小路径中必定也是第i-1层的最短路径,即这个大问题可以有各个小问题合并求解,采用DP。DP三个步骤:列出状态转移方程,确定边界,确定计算顺序。状态转移方程:使用** dp[i][j] **表示到达矩阵的第i行第j列的最小路径和。正常情况下:(i,j)这个位置只能由上层的j列或j-1列到达,所以dp[i][j] = min{dp[i-1][j-1], dp[i-1][j]} + nums[i][j]特殊位置:处于最左侧的位置只能顺着最左侧下来:dp[i][0] =

2021-10-01 19:49:41 155

原创 Leetcode刷题笔记——994. 腐烂的橘子【BFS】

题目分析很容易想到BFS,按层腐烂好橘子。注意第一步应该将所有的坏橘子入队,每次遍历一层,遍历一层res+1。需要找到所有的坏橘子,需要在开始时遍历整个矩阵,同时记录好橘子的个数cnt,每腐烂一个好橘子cnt–,最后看cnt是否为0,若不为0说明有好橘子未被腐烂,返回-1;特殊情况,根本没有坏橘子,分两种情况,一种没有坏橘子也没有好橘子即矩阵为全0矩阵,这种情况在第0分钟就没有好橘子了;第二种情况没有坏橘子但是有好橘子,会出现队列为空,但是cnt不为0的情况,这种情况返回-1,与正常流程合并。r

2021-09-28 20:21:10 177

原创 Leetcode刷题笔记——617. 合并二叉树【DFS】

题目分析显然这是一道搜索算法题,本题若采用BFS需要考虑很多种情况,而采用DFS则代码比较简洁易懂。首先DFS采用递归,函数传入两个节点,优先考虑出递归的条件:若两个根节点都是空节点则直接返回空节点若两个节点中有一个节点是空节点则直接返回另一个非空节点出递归条件考虑完,开始走一遍正常流程:两个节点都非空,则new一个节点,该节点的val由这两个非空节点的val相加得到,该节点的左孩子由这两个非空节点的两个左孩子决定,右孩子同理。完成val left right之后返回创建的这个节点。代码

2021-09-27 21:43:29 114

原创 Leetcode刷题笔记——剑指 Offer 32 - III. 从上到下打印二叉树 III

题目分析典型的层次遍历题目层次遍历代码模板:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vect

2021-09-25 12:10:31 138

原创 Leetcode刷题笔记——725. 分隔链表

题目分析很容易就想到利用链表长度n先除以k得到每一个子链表的最短长度,再n对k取余得到前几个链表的长度应该加1。实际构造过程中,逻辑稍微有点混乱。小技巧是首先令specialList = n%k; 这代表了前specialList个子链表应该加1个节点。利用for循环给每一个子链表添加length=n/k个节点之后,判断specialList的值若大于0则在尾部添加一个节点,添加之后specialLsit–,之后将该子链表最后一个节点的next置为nullptr。得到链表长度后只需要对原链表遍历一

2021-09-23 18:09:40 149

原创 leetcode刷题笔记——733图像渲染

题目思路首先想到广度优先搜索(BFS)与深度优先搜索(DFS),要背下BFS与DFS,往上面套就行。BFS与队列相匹配,DFS与栈相匹配。BFS模板:queue<int> Q;int visited[N + 1] = { 0, };Q.emplace(第一个元素);while(!Q.empty()){ int x = Q.front(); Q.pop(); //在此处添加出队列后的操作 visited[x] = 1; // for(int i...与当前元素相关的入

2021-09-23 18:00:01 187

原创 Leetcode刷题笔记——剑指 Offer 35. 复杂链表的复制

题目分析本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建,因此我们需要变换思路。一个可行方案是,我们利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。即本题难点在于该随机指针在深拷贝时其内容尚未

2021-09-22 16:45:26 211

原创 leetcode刷题笔记——剑指 Offer 30. 包含min函数的栈

题目采用两个栈,一个数据栈一个最小值栈,数据栈正常进行栈操作,最小值栈用来保存当前数据栈中的最小值,每push一个值最小值栈就更新一次。例如将 2 1 3 4 5 6入栈,最小值栈则为 2 1 1 1 1 1 。因为实现min功能对当前数据栈中的其他数完全不感兴趣,只需要保存当前的最小值就行。注意栈的相关操作:stack<int> s;stack(const stack&); //复制构造函数 stack<int> s2(s1);s.push(1);in

2021-09-20 20:08:49 94

原创 leetcode刷题笔记——189.旋转数组

题目思路该题可使用较多方法,做题时我只想到第一种比较简单的方法,后看题解第二种方法由于第一种第一种class Solution {public: void rotate(vector<int>& nums, int k) { int n = nums.size(); vector<int> newArr(n); for (int i = 0; i < n; ++i) { newA

2021-09-07 20:39:01 138

原创 leetcode刷题笔记——704、278、35二分查找

二分查找二分查找模板class Solution {public: int search(vector<int>& nums, int target) { int low=0; int high = nums.size()-1; while(low<=high){ int mid = low +(high - low)/2; if(nums[mid] == targe

2021-09-06 21:01:28 158

原创 leetcode刷题笔记——470.rand7()实现rand10()

题目:思路:要求rand10()输出均匀分布并不代表着每个输出的数概率为1/10。运行两次rand7(),第一次作为十位第二次作为个位,比如第一次取得6,第二次取得3,则(63)为一次组合,这个组合为7进制数。将此数转化为十进制数,公式为7*(6-1)+3=38。即运行两次rand7()可以得到的十进制数应该为7*(rand7()-1)+rand7()。我们令res=7*(rand7()-1)+rand7(),显然res∈[1,49]。因为两次运行rand7()独立,所以res取得[1,49]内

2021-09-05 20:57:27 96 1

原创 leetcode刷题笔记——5.最长回文子串

题目:思路:整个问题可以分解为小问题,一个字符串为回文串则其首尾必定相等,除首尾之外也是回文串。这种大问题分解为小问题,首先想到动态规划。接下来是动态规划的步骤,列出状态转移方程,确定计算顺序。这个问题中,很容易就可以想出状态转移方程为:其边界条件为:代码:class Solution {public: string longestPalindrome(string s) { int n=s.size(); if(n<2){

2021-07-22 22:31:37 119

原创 leetcode刷题笔记——664. 奇怪的打印机

题目:思路:整个问题可以分解为小问题,比如abcacb这个字符串就可以表示为abca+cb,其次数也满足相加。这种大问题分解为小问题,首先想到动态规划。接下来是动态规划的步骤,列出状态转移方程,确定计算顺序。这个问题中,令f[i][j]表示字符串s的第i位到第j位需要打印的次数,那么可以想到如果首尾两个字符相同,其次数与去掉尾部字符的字符串打印次数一致,即S[i]=S[j]则f[i][j]=f[i][j-1]。如果首尾不一致,则需要分别完成区间左右两部分的打印,记两部分为 [i,k][i,k] 和

2021-05-24 16:15:10 103

原创 leetcode刷题笔记——421. 数组中两个数的最大异或值

题目:思路:采用字典树,所谓字典树见下图从高位保存数字,将数字的二进制形式的最高位保存至树的最高层。这样我们可以根据异或的性质,只有两个不同的值才能得1,也就是说,当要获取树中与0010异或结果最大的数,优先考虑的是1101,每一位都不同,此处采用贪心思想。如果树中不存在与某位相反的值,则取相同值。采用字典树的好处是,仅需要log(n)就可以得到能够取得最大异或值的数。字典树的数据结构:struct Trie{ Trie* left = nullptr; //字典树左指

2021-05-23 11:38:28 150

原创 leetcode刷题笔记——1734、解码异或后的排列

题目:思路:假设原数组perm=[a,b,c,d,e],n=5;异或后编码数组encoded=[A,B,C,D]。那么A=a^b B=b^c C=c^d D=d^e。又因为perm是由前n个正整数构成的随机顺序的数组,则perm的全部元素异或结果是已知的,x=1^ 2 ^ 3 ^ 4 ^5 = perm[0]^ perm[1] ^ perm[2] ^ perm[3] ^perm[4].其中perm[1] ^ perm[2]=B=encoded[1],perm[3] ^ perm[4]=D=en

2021-05-22 17:06:14 105

原创 leetcode刷题笔记——2.两数相加

leetcode刷题笔记——2.两数相加思路:简单的链表处理,不为空则将其值与另一链表相加,用carry保存进位信息。需要注意的点是:1、使用链表的节点之前一定要判断该节点是否为空节点2、struct结构使用.表示其成员(读作“的”),而结构体的指针则用->表示其成员(读作“指向结构体的”)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next;

2021-05-07 21:24:31 354

原创 python3安装robot framework的excellibrary库

python3安装robot framework的excellibrary库目前robot framework 的ExcelLibrary版本为0.0.2,只支持Python2,若要使其支持Python3,需要对一系列文件进行修改,本文参照https://blog.csdn.net/weixin_43992799/article/details/103094809对ExcelLibrary进行了修改,下载安装了一系列的依赖,文末附上百度网盘链接,下载后只需要简单几步即可使基于python3的exc

2020-12-17 16:32:01 1400 2

原创 使用python3与pip安装Robotframework-AutoItLibrary库

使用python3与pip安装Robotframework-AutoItLibrary库目前很多教程对于AutoItLibrary的安装都是python 2.7的 而我最近由于项目原因需要使用python3.8,目前又需要在RIDE中使用 AutoItLibrary库,查找了很多资料,找到比较快能安装AutoItLibrary的方法本人使用的电脑系统为WIN10 64位 专业版一:安装pywin32可以在官方网站上下载:https://sourceforge.net/projects/pywin3

2020-12-13 17:22:27 1525

空空如也

空空如也

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

TA关注的人

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