leetcode53-最大子数组和
摘要:
最大子数组和 dp 记录当前位置的累加和以及最大子数组和。 遍历数组并累加,如果发现累加和小于0,那么前面累加的东西反而会使得后面的和变小,那么直接丢弃,将累加和清零。 class Solution { public int maxSubArray(int[] nums) { int max = n
leetcode115-不同的子序列
摘要:
不同的子序列 dp 维护一个二维dp数组,分别表示s[0:i]和t[0:j]的分配种类。 如果j等于0,由于模式串没有进行匹配,那么对于所有的原串来说,都只有一种匹配方式,所以需要赋值1。 然后进行遍历,如果s[i]和t[j]相同,那么有两种选择,匹配或者不匹配,dp[i][j] = dp[i-1]
leetcode44-通配符匹配
摘要:
通配符匹配 dp 和正则匹配方法类似。先去处理边界值为0的情况。dp[0][0] = true,同时让j从0到n开始遍历,如果当前的位置是*,那么dp[0][j] = true,因为可以匹配0个字符,否则表明无法继续零匹配,直接跳出循环。 然后进行二维循环,如果当前的匹配串为,那么有两种选择,匹配之
leetcode10-正则表达式匹配
摘要:
正则表达式匹配 dp dp[i][j]表示s[0:i]和p[0:j]是否匹配。 如果i == 0 && j == 0,那么说明两个字符串都没有选择字符,是true 如果j == 0,那么说明匹配串没有字符而原字符串有字符,是false 否则,需要根据字符进行分类讨论(注意:i == 0无法判断是tr
leetcode5-最长回文子串
摘要:
最长回文子串 中心扩展法 从中心向两侧扩展,分为两种情况:一种是奇数长度,一种是偶数长度,需要分开讨论。 class Solution { public String longestPalindrome(String s) { int n = s.length(), left = 0, right
leetcode42-接雨水
摘要:
接雨水 dp 维护两个dp数组,分别记录左侧和右侧的最大值。当前位置的雨水就是左右两侧最大值的较小值减去当前位置的高度,将所有雨水累加即可得到结果。 class Solution { public int trap(int[] height) { int n = height.length, lef
leetcode32-最长有效括号
摘要:
最长有效括号 dp dp[i]表示以i为结尾的有效括号的最大长度,dp转移方程如下: 如果i是)且i-1是(,那么dp[i] = dp[i-2]+2 如果i是)且i-1是),且第i-dp[i-1]-1是(,这样刚好能和第i个字符进行匹配。那么dp[i] = dp[i-dp[i-1]-2] + (i+
leetcode22-括号生成
摘要:
括号生成 回溯 回溯过程中记录cnt,cnt是左括号减去右括号的数量。 如果cnt等于0,那么只能用左括号 如果cnt等于n-k,那么说明只有剩余括号位全是右括号才可以将所有左括号匹配,只能用右括号 除此之外,左右括号都可以 class Solution { List<String> list =
leetcode45-跳跃游戏 II
摘要:
跳跃游戏 II 前向dp 对于一个数i,从0到i-1进行遍历,如果在这个位置能跳跃到i,那么对i的dp值进行更新。 这种方式时间复杂度为O(n^2),效率很低 class Solution { public int jump(int[] nums) { int n = nums.length, dp
leetcode1302-层数最深叶子节点的和
摘要:
层数最深叶子节点的和 BFS 层序遍历树,返回最后一次计算的结果 class Solution { public int deepestLeavesSum(TreeNode root) { List<TreeNode> list = new ArrayList<>(); int start = 0,