![](https://img-blog.csdnimg.cn/20191109141918331.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
RainyD4y
NULL
展开
-
LeetCode 32 最长有效括号 题解
题目大意给定一个由左右括号()组成的字符串,然后判断其中最长的有效括号子串长度(即左右括号可以匹配的子串)。分析与源代码一、时间复杂度为O(n^2)的DP算法这道题我首先想到的是动态规划解法,设dp[i][j]为1表示s[i][j]为有效括号子串,那么会有两种情况的时候dp[i][j]为1:第一种是dp[i+1][j-1]=1且s[i]='(',s[j]=')';第二种是枚...原创 2020-01-20 18:07:23 · 212 阅读 · 0 评论 -
LeetCode 120 三角形最小路径和 动态规划题解
题目大意给定一个三角形数组,然后求从上到下走一条路径的最小和是多少,注意每一步只能移动到下一行的相邻结点上。分析一道比较水的动态规划题,就是当初的数字三角形,dp[i][j] = min(dp[i - 1][j],dp[i - 1][j - 1]) + triangle[i][j]。代码class Solution { public int minimumTotal(...原创 2020-01-11 21:33:35 · 175 阅读 · 0 评论 -
LeetCode 100 相同的树 题解
题目大意给定两个二叉树,然后判断是否相同,即结构相同,且对应结点也相同。分析利用深搜进行递归判断即可,注意判断边界条件:1.一个根节点为空,一个根节点不为空,返回false;2.两个均为空返回true;源代码class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { ...原创 2020-01-11 19:32:38 · 118 阅读 · 0 评论 -
LeetCode 188 买卖股票的最佳时机 IV 题解
题目大意这道题与III的区别在于给定交易数量为k,然后求最大利润。分析将III的程序维度稍微修改一下,即可完成本题,但是如果直接提交的话,会由于k达到十亿爆出内存溢出,我本来以为要用什么奇妙的滚动数组来优化,屡次尝试未果后参考了别人的题解,发现一次交易至少需要两天,那么我们可以认为如果k > n / 2,就能通过无限次的交易那种方案来解决,即利用LeetCode 122那道题的方...原创 2020-01-04 10:34:40 · 180 阅读 · 0 评论 -
LeetCode 123 买卖股票的最佳时机 III 题解
题目大意与前两题类似,不过这里要求只进行两次交易,然后求解最大利润。分析不妨设dp[i][j][k]表示第i天,至多j笔交易,持有股票(k=1)或不持有股票(k=0)时,能够获取到的最大利润。那么很显然,有如下结论:如果第j天完成至多j笔交易的话,那么它要么保持前一天的状态不变,即不发生交易,要么在今天买入股票。同理,如果第j天完成至多j笔交易且不持有股票的话,那么它要...原创 2020-01-04 10:25:02 · 169 阅读 · 0 评论 -
LeetCode 122 买卖股票的最佳时机 II
题目大意这道题与上一题类似,不过区别在于,可以对股票进行无限次购买,可在购买之前需要将已经购买的卖出。分析一种很直观的想法,当当前值大于下一天的我们就卖出,如果小于就更新最大值或者卖出再买入,但是需要证明:考虑的其实就是一个这样的状态,如果有四天的股票价格分别为a b c d,a<b且c<d,现在究竟该在a买b卖c买d卖,还是a买d卖(等价于a买入bc连续卖出买入,最后...原创 2020-01-01 17:14:32 · 128 阅读 · 0 评论 -
LeetCode 121 买卖股票的最佳时机 题解(动态规划)
题目大意给定一个数组,第i个数代表一个股票第i天的价格,求这个股票可以收到的最大利润。分析设dp[i]表示前i天可以获得的最大利润,再设变量max与min表示当前股票的最大price与最小price,那么可以得到如下状态转移方程:dp[i]=max(max - min, dp[i - 1]),i >= 1,这个状态转移方程很容易计算,注意一下求解完第i天之后,要将min与max的...原创 2020-01-01 17:03:55 · 160 阅读 · 0 评论 -
LeetCode 149 直线上最多的点数 题解
题目大意这道题给定n个点,然后求最多有多少个点可以共线。分析我用了比较朴素的算法,枚举两个不重合的点来计算一条直线,然后判断所有的点有多少会在这条直线上,进而求出最大值,为了避免直线不存在的情况,我这里使用的两点式方程求直线。注意一种极端情况,就是所有的点都是同一个点,那么不存在直线,直接返回n即可。代码public int maxPoints(int[][] point...原创 2019-12-28 22:35:19 · 275 阅读 · 0 评论 -
LeetCode 98 验证二叉搜索树 题解
题目大意给定一个树结构,判定这个树是不是二叉搜索树。分析首先给出二叉搜索树的定义:1.节点的左子树只包含小于当前节点的数。2.节点的右子树只包含大于当前节点的数。3.所有左子树和右子树自身必须也是二叉搜索树。这里有几个要点,小于、大于意味着比较的时候等于不能满足条件,之后要求的是左子树所有节点都要小于当前节点,右子树的所有节点都要大于当前节点,这意味着不仅儿子节点要满足...原创 2019-11-17 17:02:09 · 168 阅读 · 0 评论 -
LeetCode 41 缺失的第一个正数 题解
题目大意给定一个无序的整数数组,然后求最小的没有出现过的正整数,比如给定[1, 3, 4],那么最小的没有出现过的正整数就是2。分析这个题目要求的是O(n)的算法,可以学习桶排序的思想(也或者是一种利用下标来做哈希索引的思想)。首先遍历数组,求出其中的最小与最大的正整数,然后设一个bool数组index来判断某个数是否出现过,要注意的是需要平移一下下标,比如index[i]对应的是...原创 2019-11-17 16:12:59 · 145 阅读 · 0 评论 -
LeetCode 17 电话号码的字母组合 题解
题目大意给定一个字符串,由2-9几个字符组成,然后每个字符按照手机键盘的规则对应到几个字母,然后依次将字母转换,求出所有可能的组合。分析一个比较容易想到的做法是使用深搜,搜索树上每个状态就是选择一个当前数字可以添加的字母加到当前字符串中,如果长度达到输入字符串长度的时候,就认为是一个可行解,最后求出所有可行解即可。代码map<char, string> getSt...原创 2019-11-14 20:17:36 · 377 阅读 · 0 评论 -
LeetCode 4 寻找两个有序数组的中位数 题解
题目大意给定两个有序数组,求这两个数组的中位数,时间复杂度要求是O(log(n+m))。分析这道题各种解法很多,我这里提供了关于中位数定义的那种解法。简单来讲,中位数就是找到一组有序数中间位置的值,如果这组数有偶数个,那么中位数是最中间两个数的平均值,奇数个那么就是正中间的那个数。把数组nums1和数组nums2分别在 i 和 j 进行划分,将 i 的左边和 j 的左边组合成“...原创 2019-11-10 19:41:16 · 284 阅读 · 0 评论 -
LeetCode 8 字符串转换整数 (atoi) 题解
题目大意给定一个字符串,将其题目要求转换为整数,具体要求可见原题链接(https://leetcode-cn.com/problems/string-to-integer-atoi/)。分析这道题恶心的地方在于对各种情况进行排除,我的做法是:1.首先移除所有的前置空格,移除完成后判断是否是空串,如果是返回0;2.接着判断第一个字符是否为正负号,如果是则第二个要求是数字才可以,如...原创 2019-11-10 18:40:16 · 129 阅读 · 0 评论 -
LeetCode 16 最接近的三数之和 题解
题目大意给定一个数组与target,然后从数组中选三个数使它们的和与target最接近。分析其实思路与第十五题比较相似,只是在双指针移动的时候要用三数之和与target做差来决定指针移动,比如大于零,那么说明三数之和比较大,需要将right向左移动。注意,首先要排序,然后可以剪枝。比如第五行,我们需要让nums[i]与左边的nums[i-1]相等,才能对这种情况剪枝,不能通过num...原创 2019-11-09 19:03:33 · 120 阅读 · 0 评论 -
LeetCode 5 最长回文子串 题解
题目大意给定一个字符串,求它最长的回文子串,子串意味着要在给定的字符串中连续,回文则要左右对称。分析设dp[i][j]为s[i][j]是否为i最长回文子串,那么很容易得到s[i][i],s[i][i+1]的情况,接下来进行递推计算长度大于等于3的回文子串:当s[i] = s[i + len - 1]且dp[i + 1][i + len - 2]=true的时候,dp[i][i + ...原创 2019-11-09 09:12:15 · 156 阅读 · 0 评论 -
LeetCode 215 数组中的第K个最大元素 题解
题目大意给定一个数组,求它的第K大的元素。分析使用堆、二叉排序树、快排之类的都可以,我直接用了C++ STL自带的priority_queue代替手写堆了。代码int findKthLargest(vector<int>& nums, int k) { priority_queue<int,vector<int>,less<...原创 2019-11-08 20:59:14 · 100 阅读 · 0 评论 -
LeetCode 513 找树左下角的值 题解
题目大意给定一个二叉树,求最深一层的最左节点值。分析首先我们需要先进行一轮DFS去求解这个二叉树的最大深度,然后再进行深搜,按照先左后右的顺序,当搜索到第一个处于最大深度处的节点时返回答案。代码int max_depth, ans;bool isVis;void check_depth(int depth, TreeNode* root) { //计算最大深度 ...原创 2019-11-08 20:34:04 · 149 阅读 · 0 评论 -
LeetCode 39 组合总和 题解
题目大意给定一个包含无重复元素的数组candidates和一个目标数target,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。分析一个很直接的想法是使用深度优先搜索,因为每一个元素可以放入无限多次,所以我们在进行下一轮搜索的时候需要将当前元素继续考虑进去,而结束当前这个状态搜索的边界条件是target<0或...原创 2019-11-08 08:45:33 · 173 阅读 · 0 评论 -
LeetCode 47 全排列 II 题解
题目大意给定一个包含重复元素的数组,求全排列。分析为了做这道题,首先要理清求全排列的本质,实际上求全排列就是固定前面的数,然后对后面的数进行选择,比如一开始的时候选择第一个数,然后对剩下的数进行全排列,这样相当于转换为一个子问题,递归求解。那么对于这个问题,假设我们有1,1,3,4四个数,那么对于第一个位置,首先把1放置到这个位置,然后对剩余三个数进行全排列,接下来考虑第二个1时,没有必要...原创 2019-11-06 20:41:36 · 154 阅读 · 0 评论 -
LeetCode 36 有效的数独 题解
题目大意给定一个初始的数独状态,判断是否满足要求:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。分析一次二重循环遍历一下这个数独,根据要求判定即可。代码bool isValidSudoku(vector<vector<char>>& board) { ...原创 2019-11-05 21:06:42 · 204 阅读 · 0 评论 -
LeetCode 35 搜索插入位置 题解
题目大意在一个有序数组中查找给定的一个数,给出它出现的最左与最右的位置,要求时间复杂度是O(logn)分析根据时间复杂度,很明显能看出来要用基于二分的方法,将二分查找稍微修改一下就好,传统的二分查找当我们在中间位置找到了target的时候会直接返回,如果要查找最左出现的位置,可以判定一下nums[mid - 1],如果等于target的话,就将right改为mid - 1,继续迭代,同理可以...原创 2019-11-05 20:29:41 · 145 阅读 · 0 评论 -
LeetCode 15 三数之和 题解
题目大意:在一个数组中求出所有a,b,c,使得a+b+c=0,注意元素不能重复,且(a,b,c)不能重复。分析:(一)最直接的想法是直接枚举a,b,c,这样的做法是O(n^3),很明显会超时。(二)接下来有两个想法,我最初想到的是首先排序,然后枚举a和b,然后在剩余元素中二分查找判断是否存在-(a+b),这样的时间复杂度是O(n^2logn),另一个想法是利用哈希表来判断是否存在-...原创 2019-11-05 20:15:49 · 192 阅读 · 0 评论