自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

untilyouydc

You don’t think other people’s understandings as the nuts and bolts in that you are yourself of great account and proud as a kin

  • 博客(43)
  • 收藏
  • 关注

原创 DELL EMC电话面试

1. 先英文介绍2. 用英文提问了,你用过哪些语言,那种语言你最喜欢?原因3. 算法题:给一个单链表,给一个指针指向某个节点,要求删除这个节点。(一开始没反映过来,后面面试官提示,删除节点不一定是要删除结构,也就是把下一个节点复制过来,删除下一个)4. 算法题:判断是否有环(双指针,一个指针每次走一步,另一个每次走两步)。求环的大小(走的步数相减即可)。5. 操作系统,进程与线程...

2020-02-19 18:01:47 821 3

原创 leetcode 150. 逆波兰表达式求值

class Solution {public: int evalRPN(vector<string>& tokens) { stack<int> sta; int n=tokens.size(); for(auto i:tokens) { if(i=="+"||i==...

2020-02-18 11:43:27 139

原创 leetcode 145. 二叉树的后序遍历

解题思路后序遍历确实很麻烦。需要多加一个标记栈。因为第一次遍历的时候,先不用出栈,只有当它的子节点都遍历以后才出栈。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tree...

2020-02-18 11:28:55 181 2

原创 leetcode 144. 二叉树的前序遍历

解题思路不让用递归,那只能自己模拟了。其实很简单,前序遍历的话,只要先把右边的节点push到栈里即可。具体原因可以自己画图分析。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * ...

2020-02-18 10:34:24 124

原创 LeetCode 103. 二叉树的锯齿形层次遍历

解题思路说白了就是一个层次遍历。关键点在于遍历当前层次的时候,把下一层应该有的数量记录下来即可。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x...

2020-02-18 10:23:41 179

转载 Mysql中MVCC的使用及原理详解

准备测试环境:Mysql 5.7.20-log数据库默认隔离级别:RR(Repeatable Read,可重复读),MVCC主要适用于Mysql的RC,RR隔离级别创建一张存储引擎为testmvcc的表,sql为: CREATE TABLE testmvcc ( id int(11) DEFAULT NULL, name varchar(11) DE...

2020-02-17 14:27:23 174

原创 leetcode 84. 柱状图中最大的矩形

思路: 单调栈维护一个单调上升的栈。因为保证单调上升以后,从后面开始,每一个都可以作为高。为了方便计算宽度。先压入一个-1即可。public class Solution { public int largestRectangleArea(int[] heights) { Stack < Integer > stack = new Stack <...

2020-02-17 12:36:32 142

原创 leetcode 71. 简化路径

直接用栈模拟一下即可。class Solution {public: string simplifyPath(string path) { int n=path.size(); if(n==0) return ""; stack<string> sta; int k=0; while(pat...

2020-02-17 08:49:22 143

原创 leetcode 42. 接雨水

解题思路思路其实很清楚。计算加上水以后的面积,然后减去原始的面积(即高度之和)。剩下的就是能接的雨水。问题是如何计算加上水以后的面积?有一个单调栈的思路。从左开始遍历(设top=l),直到遇到比height[top]大的height[i].意味着,从top到i之间可以构成以height[top]为高,底为i-top 的长方形。此时可以计算面积。如果最高的在中间怎么办?其实很简单,再重最右边...

2020-02-15 22:29:03 113

原创 leetcode 600. 不含连续1的非负整数

非常明显的数位dp。有两种状态表示的方法。1。dp[pos][pre[sta] 表示到第pos位,前一位为pre,当前状态为sta的个数。class Solution {public: int dp[40][2][2]; int bit[40]; int dfs(int pos,int pre,int sta,bool limit) { ...

2020-02-15 09:36:21 228

原创 leetcode 688. “马”在棋盘上的概率

解题思路逆向思考:dp[i][j][k]表示从某个点走k步回到(i,j)的概率。那么一开始dp[i][j][0]=1.0(其中(i,j)在盘内),若(i,j)不在盘内,则dp[i][j][0]=0.0;dp[i][j][k]=(8个方向的k-1之和)/8.0 。除以8.0是因为,有8种选择可以回到(i,j),走任何一条路径的概率是1/8代码class Solution {public:...

2020-02-15 09:18:19 142

原创 LeetCode 576. 出界的路径数

解题思路这题其实用逆向思维更简单。dp[i][j][k]表示从外界走k步能到达(i,j)。状态转移很简单,无非就是dp[i][j][k]+=(4个方向的k-1步)。代码#include <bits/stdc++.h>class Solution {public: const int mod=1e9+7; int findPaths(int m, int n, ...

2020-02-15 08:43:16 143

原创 leetcode 41. 缺失的第一个正数

思路:在原数组上进行排序。之所以可以这样做,其实是因为我们只需要考虑范围在[1,n]直接的数。而原数组刚好也有n个位置。对于第i个元素,nums[i],假设其值为4,那么它应该在数组的第4个位置,所以将nums[i]于nums[nums[i]-1]交换位置。直到nums[i]==i+1或者,nums[i]不在[1,n]内。最后,扫描一遍数组,当发现nums[i]!=i+1时,即可知答案。...

2020-02-14 22:25:15 115

原创 leetcode102. 二叉树的层次遍历

解题思路难点是记录层的最后一个节点。思路:在还未到达该层的最后一个节点前,提前记录下一层的最后一个节点代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(i...

2020-02-14 10:24:20 132

原创 leetcode 81. 搜索旋转排序数组 II

这题和搜索旋转排序数组 唯一的区别就是可能会有重复的元素。也就是会出现[1,3,1,1]这样的数据。之前无重复时,我们可以断定,二分的点一定属于某个有序序列。但现在不行了,例如取mid=2,此时,nums[0]==nums[2],无法断定mid属于前一段还是后一段。不过有一个思路就是,既然nums[mid]==nums[l],那么nums[mid]不是我们想要的,那么nums[l]也必然不是...

2020-02-13 21:38:21 127

原创 leetcode 494. 目标和

题目其实很简单。不过处理起来比较麻烦。dp[i][j]表示前i个数,组成值为j的方案数。其实只要找dp[i-1][j-num[i]] 和dp[i-1][j+num[i]] 即可。但是j可能为负数。所以多增加一维来记录j是 正数还是负数即可。dp[i][j][0] 表示j>0dp[i][j][1] 表示j<0其实第一维可以直接优化掉,但是i<20.其实也没这个必...

2020-02-08 11:43:26 140

原创 leetcode 486. 预测赢家

这题难在状态表示:dp[i][j]表示从i到j的数组中,能获得的与对方的最大差值。如果你选了nums[i],那么对方就要从(i+1,j)中选,如果你选了nums[j],对方就要从(i,j-1)中选择。dp[i][i]=nums[i]class Solution {public: bool PredictTheWinner(vector<int>& nums)...

2020-02-08 09:28:10 147

原创 leetcode 474. 一和零

双重背包裸题class Solution {public: int findMaxForm(vector<string>& strs, int m, int n) { int dp[m+2][n+2]; memset(dp,0,sizeof(dp)); for(auto s:strs) { ...

2020-02-07 10:41:13 128

原创 leetcode 467. 环绕字符串中唯一的子字符串

思路:首先要读懂题意。题意是有一个循环字符串s(abc...zabc...),给一个p。问p的子串中,有多少个也是s的子串。例如cac中,子串有c,ca,ac,cac,a 但是,同时也是s的子串的,只要c,a. 因为s字符串里没有ca相邻的。其实这是一个简单的递推。dp[i]表示以p[i]结尾是子串有多少个,如果p[i]与p[i-1]在s中相邻,那么dp[i]=dp[i-1]+1否...

2020-02-07 09:57:47 228

原创 leetcode 410. 分割数组的最大值

思路1:动态规划.这题有点特殊。之前做过一道划分m段的和的最大值。难道其实比这题要高。dp[i][j]表示前i个数分成j段得到的最大值的最小值(第i个一定包含在第j段里面)。所以我们要做的就是去枚举第j段的开始即可。为了方便求出任一段的和,先预处理求一个前缀和。dp[i][j]=min(dp[i][j],max(dp[k][j-1],sum[i]-sum[k])class Solut...

2020-02-06 09:30:38 193

原创 leetcode 413. 等差数列划分

思路1:数学法。一个规律就是长度为n的等差数列,可以分为长度大于3的子数列个数为(n-2)*(n-1)/2思路2:dp[i]表示以A[i]结尾的,长度大于等于3的等差数列个数。很容易得到dp[i]=dp[i-1]+1class Solution {public: int numberOfArithmeticSlices(vector<int>& A) {...

2020-02-05 22:08:29 184

原创 leetcode 392. 判断子序列

原题很简单,设一个双指针,遍历一下即可。现在讨论一下:如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?当去匹配的s串很多的时候,再调用上面的方法其实不行。因为s串很短,最后的方法就是每次都只遍历一遍s。具体做法:因为字符串只有26个字母,设dp[i][0]表示当前位置后面,...

2020-02-05 09:19:47 146

原创 leetcode 377. 组合总和 Ⅳ

解题思路完全背包计数的思路就不写了,因为这只要了解背包,就可以直接打出来了。这题用c++写,必须用unsigned long long 来存储。数据量很大。这里提一下完全背包的写法。其实这个题有点特殊,顺序不同的组合也要算一组,所以枚举的顺序必须是for(int j=1;j<=target;j++)for(int i=0;i<n;i++)倘若没有顺序要求即(1,2,1)和(...

2020-02-04 22:25:16 156

原创 LeetCode 376. 摆动序列

解题思路时间复杂度并不理想,没有想到使用波峰,波谷的o(n)算法。这个dp也还勉强可以通过。思路就是先计算出差值,然后对差值数组进行dp即可。代码class Solution {public: int wiggleMaxLength(vector<int>& nums) { int n=nums.size(); if(n==0...

2020-02-04 21:58:03 87

原创 leetcode 368. 最大整除子集

思路:其实和最长上升子序列的思路基本一致。dp[i]表示以nums[i]结尾的最大的整数子集。dp[i]=max(dp[j]+1,dp[i]) 其中nums[j]%nums[i]==0||nums[i]%nums[j]==0为了避免6 2 4 这样的序列出现,只需先对nums进行一下排序即可。需要输出子集,那么只要开一个path数组,记录一下路径即可。class Solution...

2020-02-04 21:28:48 271

原创 数位dp小结

数位dp小结关于limit的问题在数位dp中,limit的作用主要有两个。控制枚举的界限,倘若没有界限,每一位的枚举范围都是0-9. 但如果有界限,那么可能不能取到9. 例如求1到311范围内不含有连续两个1的个数。当百位枚举到了3,那么如果你的十位只能枚举0-2.控制剪枝的合法性: 很明显,相比于暴力搜索,数位dp唯一的优势就是剪枝。但剪枝往往会带来一些错误。在数位dp中,我们进行剪...

2020-02-04 12:34:01 264 1

原创 LeetCode 357. 计算各个位数不同的数字个数

解题思路非常经典的数位dp。麻烦的地方在于要处理前导0.例如010这样的数据如果不处理前导0的话,会认为有两个0.数位dp的思路这里不再阐述。dp[pos][sta]表示前pos位,状态为sta满足题意的数的个数。注意使用位运算来查看有没有重复的数。代码class Solution {public: long long dp[30][1<<11]; int...

2020-02-04 12:31:45 199

原创 leetcode 343. 整数拆分

思路:记忆化搜索动态规划搜索的思路很简单,对于n。考虑将其划分为1+n-1,2+n-2......等组合 取max(i*(n-i),i*dfs(n-i)) 即可。至于动态规划,则是将递归的思路直接写成两个循环即可。class Solution {public: int dp[100]; int integerBreak(int n) { dp[1]=...

2020-02-04 10:43:28 137

原创 leetcode 312. 戳气球

dp[i][j]表示从i到j序列,能获得的最大值。一开始总想着枚举区间中最先选的那个数,后面发现这样做的话,没法继续了。换一个思路:枚举最后一个选的,一切就豁然开朗了。class Solution {public: int maxCoins(vector<int>& nums) { int n=nums.size(); i...

2020-02-03 22:06:54 170

原创 leetcode 309. 最佳买卖股票时机含冷冻期

思路: dp[i][0]表示第i天结束,没有持有任何股票的最大利润,dp[i][1]表示第i天结束持有股票的最大利润。考虑状态转移dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]) 即今天结束没有持有股票,有两种情况,要么昨天也没有,要么昨天有,今天卖dp[i][1]=max(dp[i-1][1],dp[i-2][0]-prices[i]) 今...

2020-02-03 21:17:19 160

原创 leetcode 279. 完全平方数

解题思路dp[i]表示i需要的最少平方数。dp[i]=min(dp[i-nums[j]]+1,dp[i])其中nums存储小于n的平方数代码class Solution {public: int nums[3000]; int k; int numSquares(int n) { int dp[n+3]; init(n); ...

2020-02-03 12:55:20 79

原创 leetcode 264. 丑数 II

思路: dp[i]表示第i个丑数.dp[i]=min(min(dp[index2]*2,dp[index3]*3),dp[index5]*5)其中index2表示上一个2的倍数所在位置。class Solution {public: int nthUglyNumber(int n) { int dp[n+3]; dp[1]=1; ...

2020-02-03 12:22:26 84

原创 leetcode 213. 打家劫舍 II

213. 打家劫舍比较简单。这一题只不过比上一题多讨论一下第一个和最后一个取谁的情况即可复杂度2*nclass Solution {public: int rob(vector<int>& nums) { int n=nums.size(); if(n==1) return nums[0]; if(n==...

2020-02-03 11:00:20 104

原创 LeetCode 152. 乘积最大子序列

解题思路dp[i]表示以nums[i]结尾的子数组的最大乘积。需要讨论nums[i]的正负当nums[i]>0时,需要向前找到第一个非正数,假定nums[j]<=0 , 那么此时dp[i]=max(num[i]…nums[j-1]dp[j],num[i]…nums[j-1]) 其中num[i]…nums[j-1]表示连乘。同理 nums[i]<0时,需要向前找到第一个非正...

2020-02-02 21:44:27 102

原创 leetcode 87. 扰乱字符串

思路:暴力搜索对于串s1,s2来说。枚举长度为i的子串,将s1,s2都分为两部分。有以下两种情况1. s1[0:i] 可以转为s2[n-i-1:n-1] 。s1[i,n-i]可以转为s2[0,n-i]2.s1[0:i]可以转为s2[0,i] 。s1[i,n-i]可以转为s2[i,n-i].class Solution {public: bool isScramble...

2020-02-02 21:00:21 134

原创 leetcode 132. 分割回文串 II

思路1. dp[i][j]表示第i个字符到第j个字符分割成回文串的最少次数。枚举分割值k即可。dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+1)复杂度 n^3。过不了最后一组数据。采用面向数据编程的方法,可以通过。class Solution {public: int minCut(string s) { int n=...

2020-02-02 14:34:21 105

原创 leetcode 120. 三角形最小路径和

如果设成二维dp的话是非常简单的。dp[i][j]表示到第i行,第j列需要的最少值。dp[i][j]=min(dp[i-1][j],dp[i-1][j-1]) + a[i][j]其实第一维可以滚动掉。不过计算的时候,需要逆序。class Solution {public: int minimumTotal(vector<vector<int>>&am...

2020-02-02 13:04:36 85

原创 leetcode 115. 不同的子序列

设dp[i][j]表示s的前i个字符中,含有t的前j个字符的序列个数。首先先明确一点。当t为空串时,dp[i][0]=1。即空串有一种选法。当s[i]==t[j]时,dp[i][j]+=dp[i-1][j-1] 。此时还需要向前遍历,寻找s[k]==t[j]否则dp[i][j]=dp[i-1][j]。复杂度 m*m*nclass Solution {public: ...

2020-02-02 11:02:45 126

原创 leetcode 97. 交错字符串

设dp[i][j]表示s1的前i个与s2的前j个,能否组成s3的前i+j个即可。s1[i]与s2[j]必有一个在末尾。所以判断他们与s3[i+j]的关系,即可写出转移方程class Solution {public: bool isInterleave(string s1, string s2, string s3) { int m=s1.size(); ...

2020-02-02 08:32:08 105

原创 leetcode 95. 不同的二叉搜索树 II

根据上一题的思路。这次只要dfs即可。这个可以说是dfs里面比较麻烦的了,一开始打算使用二重指针,但后面发现使用vector<*> 更简单。总的来说,思路很简单。但是写的时候需要注意一些细节。dfs这种东西,只要理解了,就很容易写出来。也不太好讲。直接看代码吧。/** * Definition for a binary tree node. * struct Tr...

2020-02-01 22:14:30 63

空空如也

空空如也

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

TA关注的人

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