- 博客(28)
- 收藏
- 关注
原创 LeetCode——接雨水 C++
题目描述: 本题目乍一看雨水的数量是由多个高柱共同决定的,但是本题依然可以单独分析数组中每一个元素所对应的雨水数量,并将他们加在一起。根据木桶效应我们可以分析出当前元素所能承装的雨水数量为其左右两边最大值(包括本身)中的较小值减去本身的大小,即:min(left[i],right[i])-height[i]其left与right数组中的值代表当前左右两边的最大值,用动态规划方法维护。、完整代码如下:int trap(vector<in...
2022-03-15 16:40:20
712
原创 LeetCode——子数组范围和 C++
题目描述:本题为了实现O(n)的时间复杂度采用了单调栈的解法。通俗来说就是找出每一个元素向左看与向右看的相比较于这个元素的更大值和更小值(这意味着需要四个数组来存储位置下标)来确定该元素在左右两个方向的那些子数组中充当最大和最小值,具体实现四个数组的方法为用大值栈和小值栈来存储遍历的元素。当不满足条件时将数据弹出,完成当前回合遍历时将数据压入栈。最后用公式来求解出最小值之和以及同理的最大值之和,最大和与最小和相减即为答案。PS:当出现相等元素的时候,可以定义i的左右优先级来判断大小,
2022-03-04 15:07:13
479
原创 LeetCode——寻找最近的回文数 C++
本题的主要思路为首先在原序列的二分位处截断,在右边制造同等长度回文数,比如“123”在2处截断制造为“121”,但是有许多特殊情况,比如“10”的最近回文数不是“11”而是“9”。所以本题目需要分六种情况讨论。1.在原序列的二分位截断后直接制造回文数。2.在原序列的二分位截断后加1再制造回文数。3.在原序列的二分位截断后加1再制造回文数。4.制造与原序列相同位数的“9”序列,如“99999”。5.制造与原序列少一位数的“9”序列。6.制造101序列,如“10000...
2022-03-02 22:26:52
576
原创 LeetCode——复数乘法 C++
题目描述:该题目做法只需根据题目要求将实数部分和虚数部分分别算出来并将其转化为字符串即可,对于题目中输入的字符串可凭“+”为界将其分成两个子串并转化为整数类型计算。完整代码如下:string complexNumberMultiply(string num1, string num2) { int x1,y1,x2,y2; for(int i=0;i<num1.size();i++){ if(num1[i]=='+'){
2022-02-25 14:22:57
482
原创 LeetCode——仅仅反转字母 C++
题目描述:此题较为简单,只需在标准反转字母的题目基础上加入非字母的判断即可。当判断当前字符为非字母时跳过该字符。 完整代码如下:string reverseOnlyLetters(string s) { int i=0,j=s.size(); while(i<j){ if(!(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]...
2022-02-23 14:03:39
517
原创 LeetCode——Nim 游戏 C++
题目描述:这道题许多人看到后第一反应是用动态规划来解决这个问题,但是往后面看一下提示信息:1 <= n <= 2的32次幂-1对于这样庞大的数据范围,普通动态规划已经很难在规定时间内完成任务。因此我们可以考虑一下非常规解法。其实从题目中就已经给出了提示信息,从示例1中可以看出当最后n剩4的时候在我方先手时无论怎样拿都会输,所以我们要争取在剩4的时候对方先手,这样可以保证一定胜利。我们也可以发现无论对方怎样选择,都可以将双方一回合的获取数量控制在...
2022-02-22 16:46:07
3153
原创 LeetCode——推多米诺 C++
题目描述: 本题目思路为先正序遍历标记所有右倒倾向的骨牌,然后再倒序遍历标记所有向左倒倾向的骨牌。当一个骨牌既有右倾也有左倾的时候将其标记为待判定状态,在本程序中用“1”表示右倾,“2”表示左倾,“3”表示待判定状态。最后用双指针方式来对待判定状态的骨牌做最终判定,即从左右两头向中间更改状态。这样做的好处是不用做额外的如“R..R..”等类型骨牌的判定,只需要最终做中间态骨牌判定即可。完整代码如下:string p...
2022-02-21 13:10:37
315
原创 LeetCode——1比特与2比特字符 C++
题目描述:这道题由于给定了一个01序列,且我们可以从题意中看出当出现1时,必须要和后面一个字符搭配,遇到0的时候可以直接跳过该字符。因此我们可以采用正序迭代的方式来解决此题,当迭代到最后一个元素时停止,按照停止的位置来判断该序列是否合法。因为当倒数第二位为1且其需要搭配时(如题目中示例2),必然会使指针跳出该序列,从而可以判定该序列为非法序列。(这里需要注意有人认为只判断倒数第二位元素即可,但是类似[1,1,0]这样的序列是合法的,因此必须从头开始判断)...
2022-02-20 13:16:28
303
原创 LeetCode——二叉搜索树的后序遍历序列 C++
题目取自LeetCode:这道题让我们根据后序遍历结果来判断是否为合法的二叉搜索树。首先我们可以找一下遍历序列和二叉搜索树之间的关系,既然是后序遍历结果,那么我们可以知道数组中最后一个元素一定为二叉树的根节点,因此我们可以从这个方向入手编写程序。 在知道二叉搜索树的根节点后我们可以根据搜索树的性质(左子树一定小于根节点,右子树一定大于根节点)来判断是否为合法的二叉搜索树。对于题目示例数组[1,6,3,2,5]来说其构成的二叉搜索树根节点必定为5,接下来找到其左右子...
2021-12-31 17:20:13
774
原创 LeetCode——适龄的朋友 C++
题目描述: 本题的题目要求中第三个式子条件因为包含在第二个式子中,所以该式子可以省略掉,对于式子二:age[y] > age[x]我们可以用一个快排来解决,这样始终满足后面元素向前发出好友请求,再结合式子一进行判断即可。 本题可以采用双指针方法来避免两次循环的时间复杂度,还有一点就是同龄人之间是可以相互发送的,对于这个条件我们可以用一个同龄计数器来记录有多少连续的同龄人,在最终计数器中添加进同龄计数器中的数字即可(注意在迭代中及时将同龄计数器归零否...
2021-12-27 14:13:06
244
原创 LeetCode——喧闹和富有 C++
题目描述:本题依旧属于那种比较难理解但是较为好做的题目, 直接采用暴力方法遍历会超时。因此可以借助邻接矩阵来加速遍历流程。vector<vector<int>>record(quiet.size(),vector<int>()); 在根据richer数组建立邻接矩阵后可以直接根据该邻接矩阵进行下一步判断,比如题目中的示例1按照元素数量生成的邻接矩阵为:{{0, 1}, {1, 2, 3}, {2}, {3, 4, 5, 6...
2021-12-15 15:07:37
1078
原创 LeetCode——保持城市天际线 C++
题目取自LeetCode: 该题目的题意可以理解为对于矩阵中任意一个元素,在其对应的行和列分别取最大值,然后在两个最大值中取最小值即为新的矩阵元素,然后计算出所有差值即可。 以第一行第一列为例,第一行最大值为8,第一列最大值为9,那么[0][0]位置的元素可变为8,差值为8-3=5。依次计算出矩阵中所有差值并叠加即可。完整代码如下:int cul_num(vector<vector<int>>& grid,in...
2021-12-13 13:52:19
750
原创 LeetCode——边界着色 C++
题目取自LeetCode: 本题目为DFS深度搜索的变种题,可以采用DFS的思想进行遍历,但是要注意本题中只需要对边界进行染色,而DFS遍历的时候是将全部都进行染色,因此需要建立备份矩阵进行染色记录。完整代码如下: vector<vector<int>>grid_new; bool isok(vector<vector<int>>& grid,int row,int col,int color...
2021-12-07 14:50:46
655
原创 LeetCode——整数除法 C++
题目描述:取自LeetCode 这道题的难点在于int边界值的判断以及采用减法代替除法时循环效率问题。循环效率问题可以采用逐步给除数加倍的方式(幂加速)来优化效率,防止超时情况发生。完整代码如下:int divide(int a, int b) { long num=0,v=0;//用long来记录变量的值,防止溢出,v来记录最后是否需要加负号 long a1=a,b1=b; if(a<0)v++; ...
2021-12-01 16:35:28
569
原创 LeetCode——第N位数字 C++
题目取自LeetCode: 这道题目的意思为可以将所有的整数序列看成一个大字符串,找出这个大字符串中的第n位元素。比如示例2的含义为在字符串“1234567891011”中取第11个元素,即下标为10的元素,那么就是‘0’。 了解题目含义后我们可以根据这个含义来编写代码,但是直接搞出一个庞大的字符串并用下标方式寻找很不现实,因为题目要求中n的取值范围是 所以必须想别的办法找出数字。 观察这个字符串我们可以找到一个小规律,当数字为一位...
2021-11-30 13:45:28
698
原创 LeetCode——可怜的小猪 C++
题目描述取自LeetCode: 本题乍一看感觉比较有难度,但是仔细一想其实很简单。不要去想用多少猪能完成任务,而要用逆向思维来想多少只猪能完成多少任务。 首先以两只猪为例,在规定回合数(minutesToTest/minutesToDie+1)的条件下,假如规定回合数为2,就可以根据回合数建立一个矩阵,既然有两只猪那么就可以让一只猪负责行,一只猪负责列,这就形成了一个2×2的矩阵,可以完成4个桶的检验。同理如果回合数变为3,则可以完成3×3矩阵的检验。如果仅把猪的...
2021-11-25 16:12:03
330
原创 Linux 中vim保存文件时出现Can‘t open file for writing问题
如果在linux下用vim创建文件并保存时遇到Can't open file for writing的问题,如下图所示:这种情况是由于没有开通超级用户权限导致的,在命令行界面输入命令:sudo su并输入密码,即可完成超级用户权限赋予。退出超级用户只需要在命令行输入:exit完成超级用户权限设置后即可成功保存文件...
2021-11-23 15:14:29
18383
原创 LeetCode——最长回文子串(动态规划) C++
题目描述取自LeetCode: 前面的文章中介绍了本题目的暴力通过法 但是本题并不主要考察暴力算法,而是能否根据题意找到更优的解法。因此本篇博文着重介绍动态规划的解法。要采用动态规划算法就要首先明确dp数组中每个元素的含义是什么,这里我采用的是bool类型的二维数组,其中dp[i][j]表示的含义是字符串下标i~j的子串是否为回文串,如果是回文串则该位置的数组元素值为true,否则为false。(为保证不出现遗漏,遍历流程一定要从后往前) 举个例子,...
2021-11-19 14:14:33
1019
原创 LeetCode——最长回文子串(暴力解法) C++
题目描述取自LeetCode: 本题暴力解法至少需要两个for循环作为指针遍历,并且还需要一次for循环进行回文串判断,因此常规暴力解法的时间复杂度为O(n)。如果按照此方法提交往往会得到大大的红色超时。 但是在LeetCode上面本题的暴力方法也不是不能通过,只是需要“一点点”优化。 常规暴力方法相信大家都会写,这里就不做过多赘述。直接进入优化部分:1)既然本题要求寻找最长回文串,那么可以对两个指针直接长度小于当前最长回文串做剪枝,即只有当前指...
2021-11-18 17:24:31
631
原创 双分支CNN卷积神经网络搭建 TensorFlow
在掌握了简单CNN卷积网络的搭建方法后,我们来了解一下双分支CNN卷积网络的搭建基本方法。 下面我们来用代码构建一个如下结构的网络: 现在网络上面关于传统神经网络搭建的讲解有很多,但是对于多分支网络的讲解很少,所以很多人第一次看到这种网络会一头雾水并感到无从下手,其实这样的网络搭建并不算难。让大家感到困难的点在于如何将两个分支网络分别独立训练并在后面汇总到一起。 其实只需要像传统神经网络那样分别构建两个分支的网络(注意用不同的变量名......
2021-11-17 14:16:39
8023
10
原创 关于Windows应用商店中安装Ubuntu问题——请启动适用于Linux的Windows子系统功能
在Windows商店中下载Ubuntu的时候很多人会遇到安装失败的问题。如果报错信息显示“请启动适用于Linux的Windows子系统功能”,那么可以在Windows搜索框中搜索“Windows功能”勾选其中的“适用于Linux的Windows子系统功能”,并重新启动。问题解决。...
2021-11-16 14:19:02
1942
原创 LeetCode——加油站 C++
题目描述:(取自LeetCode) 一种依据题意的直接解法:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { vector<int>x;//记录每个站点花费和油量的差值 int num=0; for(int i=0;i<gas.size();i++){//计算差值 num+=g...
2021-11-15 16:53:03
598
原创 LeetCode——最大子序和 C++
题目取自LeetCode这道题目最简单也最直观的解法就是两层for循环找到所有子数组然后挨个计算每个数组的值,但是这样的解法效率太低。因此我们可以考虑用一层for循环将时间复杂度控制在O(n)来解决问题。 对于这道题目来说,最难的就是如何找子数组的起始点以及终止点。起始点选择: 因为这道题目中要求子数组必须是连续的,首先我们来观察一下简单数组[-2,1,-3,4],在这个数组中如果想取最大子数组,当遍历到1的时候前面的元素-2无论如何不能选...
2021-11-11 15:03:56
741
原创 LeetCode——摆动序列 C++
题目描述:取自LeetCode第一眼看这道题,感觉有点类似于取字符串子串的题型,的确用取字符串子串的方法可以正确解出这道题,但是这道题的最后有一个进阶要求: 这样的话就需要我们想办法用一次遍历来解决这道题。 从题目中我们可以看出,摆动序列中元素的选取是可以有取舍的。比如【2,3,4,1】这个序列按照题目要求的话应该输出2,即【4,1】两个元素。而【2,3,4,3】这个序列同样为2,即【4,3】两个元素。那么我们可以看出,既然前面的2,3,4为...
2021-11-09 20:03:58
867
原创 LeetCode——将数组分割成和相等的子数组 C++
题目描述:截图取自LeetCode 从该题目描述中0 < i, i + 1 < j, j + 1 < k < n - 1可以看出该数组至少有七个元素。且符合条件的数组一定满足如下结构: 上图中的sum1~sum4中间不仅仅包含一个元素,也可能是多个元素。当我们知道了数组结构之后,可以逐步分析了,其实如果不考虑程序效率的话完全可以按照题目描述进行暴力求解,但是这道题在LeetCode上面的题目难度为困难,所以这道...
2021-11-08 21:40:00
1600
原创 遗传算法——01背包问题中的应用 C++
对于01背包问题,本身就附带有一定能出最优解的动态规划算法。但是动态规划算法在大数据集下(30个包以上)可能要花费大量的时间。如果在工业生产中需要快速得出相关问题的结果,那么动态规划等全遍历算法就不是最优方法。这时我们引入遗传算法来帮助快速解决01背包问题。遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。遗传算法是从代表问题可能潜在的解集的一个种...
2021-11-05 13:39:21
1698
4
原创 LeetCode——N皇后问题 C++
想必大家耳熟能详的是八皇后问题,该问题是由国际象棋棋手马克斯·贝瑟尔于1848年提出。采用回溯法可以很轻松的解决,但是将其转变为N皇后之后则需要一点小小的改动。 本文中采用的回溯法基本架构来源于 vector<int>x; vector<vector<string>>xx; bool isok(vector<int>x){ vector<int>a=x; ...
2021-11-05 12:44:34
518
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人