LeetCode
untilyouydc
月份未到你也得接受
展开
-
LeetCode 214. 最短回文串(马拉车算法)
https://leetcode-cn.com/problems/shortest-palindrome/策略很容易看出来,只要求出以s[0]为起点的最长回文子串长度就行,因为以s[0]为起点的最长回文子串已经满足了回文串的要求,接下来只需要在前面加上s剩余部分的逆序即可。即将s分成s1+s2,其中s1为以s[0]为起点的最长回文子串。最后答案就是 s2^ + s (s2^表示s2的逆串)那么下面难点就是判断s[0]-s[i]是否能构成回文串。如果令i=0.....n,依次去判断的话,复杂度原创 2020-08-29 23:09:42 · 476 阅读 · 0 评论 -
二叉搜索树的代码实现
1. 定义节点struct Node{ int val; Node* left; Node* right; Node(){ val=0; left=NULL; right=NULL; } Node(int x){ val=x; left=NULL; right=NULL; }};2. 构建二叉搜索树每当新插入一个值时,先在原树上进行查找,找原创 2020-08-24 14:44:43 · 2287 阅读 · 0 评论 -
LeetCode 336. 回文对
题目链接:https://leetcode-cn.com/problems/palindrome-pairs/如果直接每两个字符串合并,然后去判断是不是回文串的话,会超时。其实可以转化为匹配问题。设原串为s,那么将s拆分成s1,s2两个串,如果s1是回文串,只需去列表里找是否存在s2的逆串。同理 如果s2是回文串,则去找s1的逆串。快速查找匹配字符串的方法就是用字典树,时间复杂度只有O(len),len为字符串的长度。这个题最重要的地方应该是学习一下字典树。struct Nod原创 2020-08-22 09:22:09 · 195 阅读 · 0 评论 -
LeetCode 679. 24 点游戏
题目链接:https://leetcode-cn.com/problems/24-game/思路:非常经典的暴搜题。虽然没有什么算法,但却是练习dfs的好机会。本质就是不断从数组中取出两个数,进行加减乘除运算,然后将新值在放入数组中。剪枝有两个方向,第一当找到能得到24的组合时,结束递归。第二,加法和乘法有交换性。class Solution {public: double eps = 1e-5; bool ans=0; bool judgePoint24原创 2020-08-22 09:15:34 · 211 阅读 · 0 评论 -
leetcode 1545. 找出第 N 个二进制字符串中的第 K 位
给你两个正整数 n 和 k,二进制字符串 Sn 的形成规则如下: S1 = "0" 当 i > 1 时,Si = Si-1 + "1" + reverse(invert(Si-1))其中 + 表示串联操作,reverse(x) 返回反转 x 后得到的字符串,而 invert(x) 则会翻转 x 中的每一位(0 变为 1,而 1 变为 0)例如,符合上述描述的序列的前 4 个字符串依次是: S1 = "0" S2 = "011" S3 = "0...原创 2020-08-13 10:26:34 · 642 阅读 · 0 评论 -
leetcode 5465. 子树中标签相同的节点数
代码能力越来越菜了......题目链接这题本来就是一个普普通通的DFS,但我却掉进了坑了,一直在超时,后面看了题解以后才恍然大悟。我一开始的想法是,dp[i][k]表示第i个节点为根的情况下,含有字符'a'+k的个数。那么从根节点开始dfs,回溯的时候累计一下就行。我的代码是这么写的:class Solution {public: int dp[100005][26]; bool bit[100005]; vector<vector<int>原创 2020-07-19 15:32:29 · 285 阅读 · 0 评论 -
Codeforces Global Round 8 B. Codeforces Subsequences
题目链接思路:最少的字符数量,必然是利用组合数进行乘法运算。codeforces一共10个字符,当每个字符都增加一个的话,有2^10种选择,同理,每个字符都增加2个的话,有3^10种选择.....所以首先需要找到x^10 >k 。然后,按位数减小x即可。#include <bits/stdc++.h>using namespace std;long long get(long long k){ int j=k; for(int i=1;i<10;i原创 2020-06-19 09:28:12 · 341 阅读 · 0 评论 -
leetcode 1300. 转变数组后最接近目标值的数组和
思路:这种找最小满足条件的数,一般都是二分来做。首先枚举value。枚举好以后,为了能在O(logn)的时间内计算出和,可以先对原数组进行排序,然后二分找一下。最后,答案可能是l或者r。具体需要比较一下。class Solution {public: int findBestValue(vector<int>& arr, int target) { sort(arr.begin(),arr.end()); int n=arr.siz原创 2020-06-15 10:57:38 · 275 阅读 · 0 评论 -
LeetCode 739. 每日温度
思路:单调栈从前往后,维护一个单调下降的栈。当入栈元素大于栈顶元素时,说明栈顶元素已经找到下一个大于它的数了。class Solution {public: vector<int> dailyTemperatures(vector<int>& T) { vector<int> ans; int n=T.size(); if(n==0) return ans; for(int i=0;i&l原创 2020-06-12 09:50:47 · 189 阅读 · 0 评论 -
LeetCode 128. 最长连续序列
这题考查对map的使用。最简单的思路应该是开一个数组,如果含有这个数就标记为1.但这样做有两个问题,第一数据太大,第二存在负值。因此只能使用map来记录。令map[x]=x+1,那么给定x,只需要依次去查找是否有x+1,x+2....即可。这里不需要去找x-1,x-2的原因是,数组中总会找到最小数值的起点。为了能够加快查找,这里使用并查集,即假设x可以连续到x+3,那么将x并给x+3.这样就可以省去x+1,x+2的查找过程。这样需要使用unordered_map。因为map会自动排序,会使复杂度原创 2020-06-10 09:47:51 · 185 阅读 · 0 评论 -
LeetCode 面试题46. 把数字翻译成字符串
思路:dfs又是一道dfs的题目。做法基本上是一样的,本题难度其实已经被减少了,正常来说,应该让打印所有可能的串。我的做法是先将数分解,然后从最高位开始搜索,每次可以前进1步或两步(前提是满足值<=25)。最后累计一下即可。class Solution {public: int bit[100]; int n; int ans=0; int translateNum(int num) { memset(bit,0,sizeof(bit))原创 2020-06-09 10:45:10 · 148 阅读 · 0 评论 -
leetcode 990. 等式方程的可满足性
思路:并查集只有当出现‘!=’时才有可能不满足题意。因此可以先把相等的字母进行合并,合并完以后,判断不相等的字母是否在同一集合即可,如果在同一集合,那么必然会有矛盾。int f[27];int Find(int x){ if(f[x]==x) return f[x]; else return Find(f[x]);}class Solution {public: bool equationsPossible(vector<string>& eq原创 2020-06-08 10:41:46 · 128 阅读 · 0 评论 -
leetcode 面试题56 - I. 数组中数字出现的次数
思路:非常经典的位运算。先进行一次异或操作,相同的数字被抵消了。剩下两个不同的数字的异或值。剩下的事,就是把这两个不同数给拆分出来。这么想,两个数异或出来的值,如果某一位为1的话,那么这一位对应的这两个数一定是不同的。所以,最后根据i&(-i)的值。来划分数组。class Solution {public: vector<int> singleNum...原创 2020-04-14 16:38:17 · 298 阅读 · 0 评论 -
LeetCode 445. 两数相加 II
解题思路无需逆转链表。两次dfs即可第一次,需要计算出两个链表的长度。第二次,回溯过程中,直接进行相加计算。这个要求对回溯有很好的理解。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x...原创 2020-04-14 11:54:20 · 177 阅读 · 0 评论 -
leetcode 1071. 字符串的最大公因子
思路:看了一个大佬的题解,非常的巧妙。首先,str1和str2一定是由相同的子串构成的,只不过子串的数量不同而已,所以str1+str2==str2+str1. 若不满足前面的等式,那么表示没有相同的子串。其次,假设str1的长度是m构成,str2的长度是n. 那么最大的子串长度一定能同时整除m,n。 其实最大长度就是gcd(m,n)。class Solution {public:...原创 2020-03-12 08:47:43 · 192 阅读 · 0 评论 -
leetcode 543. 二叉树的直径
解题思路其实一个非常暴力的方法就是将每个节点都当做根节点,然后求左右子树的高度,相加。最后取最大值即可。但其实这样的n^2 暴力,可以优化到o(n).方法是利用回溯:当dfs的时候,记录当前节点的高度。回溯的时候,判断以当前节点为根的最大直径是多少即可。代码/** * Definition for a binary tree node. * struct TreeNode { * ...原创 2020-03-10 09:34:44 · 171 阅读 · 0 评论 -
leetcode 面试题 01.06. 字符串压缩
简单的模拟题。class Solution {public: string compressString(string S) { int n=S.size(); string ans; int cnt=1; for(int i=0;i<n;i++) { int k=i; ...原创 2020-03-16 09:21:21 · 158 阅读 · 0 评论 -
leetcode 1111. 有效括号的嵌套深度
思路:要将其分为两个合法的括号,且深度最小,那么最合理的就是将原括号里的最大深度一分为2.如何实现?考虑用一个栈来存储 '(' . 如果当前栈内有2个 '(' 那么考虑将奇数位置的分给第1个,偶数位置的分给第2个即可。同理当遇到')' 时,也只需要看当前栈内有几个'('.class Solution {public: vector<int> maxDept...原创 2020-04-01 09:36:47 · 276 阅读 · 0 评论 -
leetcde 面试题62. 圆圈中最后剩下的数字
思路1:模拟,用链表或者一个队列即可实现,但时间复杂度过高。思路2: 数学推理设 f(n,m)表示长度为n的序列,每次删除第m个以后,最后剩下的数字。那么,第一个删除的应该是(m-1)%n ,设k=(m-1)%n那么剩下的序列应该是 k+1 ,k+2 ....n-1, 0 ,1 ,....k-1 序列有n-1个数接下来应该做的是对上面的序列求F(n-1,m) ,...原创 2020-03-30 10:17:13 · 152 阅读 · 0 评论 -
leetcode 892. 三维形体的表面积
思路:bfs只要某个点上有立方体,那么最下面和最上面一定能共享2.至于侧面能否有共享,只需要看周围的4个方向的高度即可。class Solution {public: int surfaceArea(vector<vector<int>>& grid) { int dr[]{0, 1, 0, -1}; int dc...原创 2020-03-25 09:12:07 · 122 阅读 · 0 评论 -
leetcode 945. 使数组唯一的最小增量
思路:贪心怎么样才能做到最少的move?其实答案很明显,就是尽肯能的试前后两个数之间的差距是1所以考虑排序以后,倘若后面一个数比前面一个数小于或等于,那么将这个数变成pre+1即可。class Solution {public: int minIncrementForUnique(vector<int>& A) { sort(A.begi...原创 2020-03-22 09:15:28 · 118 阅读 · 0 评论 -
leetcode 面试题40. 最小的k个数
思路:快排。不用完全排序,只要划分到某个值前面有k个数即可停止。class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { int n=arr.size(); if(n==k) return arr; ...原创 2020-03-20 09:33:54 · 141 阅读 · 0 评论 -
leetcode 695. 岛屿的最大面积
bfs即可。不过需要注意,leetcode的判题系统是并发的执行样例,所以使用全局变量可能会出错。int dx[4]={1,-1,0,0};int dy[4]={0,0,1,-1};struct Point{ int x,y,step; Point(int x_,int y_,int step_):x(x_),y(y_),step(step_){}};int bfs...原创 2020-03-15 09:18:59 · 138 阅读 · 0 评论 -
leetcode 面试题59 - II. 队列的最大值
这题非常经典。与栈的最大值不同,队列由于每次出队列的是首部的数,所以维护前i个值的最大值明显无法满足O(1).这题的巧妙之处在于,维护一个单调递减的数列。因为当出现一个新的最大值时,前面的数已经没有用了。现在即使删除前面的数,最大值还是不变的。所以维护单调递减的数列,每次取最前面的数,就是队列的最大值。class MaxQueue { queue<int> que;...原创 2020-03-07 09:06:58 · 265 阅读 · 0 评论 -
leetcode 面试题57 - II. 和为s的连续正数序列
队列的简单应用。思路就是先一直往后面加,直到值》=target ,然后在考虑从前面减。class Solution {public: vector<vector<int>> findContinuousSequence(int target) { vector<vector<int> > ans; ...原创 2020-03-06 09:08:25 · 214 阅读 · 0 评论 -
leetcode 39. 组合总和
思路:暴力搜索+剪枝暴搜好像没啥好说的。关键点在于剪枝和去重。因为数字可以重复使用,但是不能出现[2,2,3],[2,3,2]这样重复的答案。解决方法是搜索时,记录一下下标,每次搜索都从当前开始,这样即保证了可以重复使用某一个数,又保证了没有重复的答案。剪枝的思路在于,先排序,如果当前的数字已经打于target,那么根本没有必要搜索下去。class Solution {publ...原创 2020-03-05 08:46:36 · 170 阅读 · 1 评论 -
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 · 146 阅读 · 0 评论 -
leetcode 145. 二叉树的后序遍历
解题思路后序遍历确实很麻烦。需要多加一个标记栈。因为第一次遍历的时候,先不用出栈,只有当它的子节点都遍历以后才出栈。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tree...原创 2020-02-18 11:28:55 · 189 阅读 · 2 评论 -
leetcode 144. 二叉树的前序遍历
解题思路不让用递归,那只能自己模拟了。其实很简单,前序遍历的话,只要先把右边的节点push到栈里即可。具体原因可以自己画图分析。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * ...原创 2020-02-18 10:34:24 · 129 阅读 · 0 评论 -
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 · 191 阅读 · 0 评论 -
leetcode 84. 柱状图中最大的矩形
思路: 单调栈维护一个单调上升的栈。因为保证单调上升以后,从后面开始,每一个都可以作为高。为了方便计算宽度。先压入一个-1即可。public class Solution { public int largestRectangleArea(int[] heights) { Stack < Integer > stack = new Stack <...原创 2020-02-17 12:36:32 · 151 阅读 · 0 评论 -
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 · 149 阅读 · 0 评论 -
leetcode 42. 接雨水
解题思路思路其实很清楚。计算加上水以后的面积,然后减去原始的面积(即高度之和)。剩下的就是能接的雨水。问题是如何计算加上水以后的面积?有一个单调栈的思路。从左开始遍历(设top=l),直到遇到比height[top]大的height[i].意味着,从top到i之间可以构成以height[top]为高,底为i-top 的长方形。此时可以计算面积。如果最高的在中间怎么办?其实很简单,再重最右边...原创 2020-02-15 22:29:03 · 118 阅读 · 0 评论 -
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 · 239 阅读 · 0 评论 -
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 · 151 阅读 · 0 评论 -
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 · 151 阅读 · 0 评论 -
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 · 120 阅读 · 0 评论 -
leetcode102. 二叉树的层次遍历
解题思路难点是记录层的最后一个节点。思路:在还未到达该层的最后一个节点前,提前记录下一层的最后一个节点代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(i...原创 2020-02-14 10:24:20 · 137 阅读 · 0 评论 -
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 · 136 阅读 · 0 评论 -
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 · 145 阅读 · 0 评论