伴你如风、护你如影|

xzh-yyds

园龄:3年9个月粉丝:0关注:2

随笔分类 -  leetcode

leetcode53-最大子数组和
摘要:最大子数组和 dp 记录当前位置的累加和以及最大子数组和。 遍历数组并累加,如果发现累加和小于0,那么前面累加的东西反而会使得后面的和变小,那么直接丢弃,将累加和清零。 class Solution { public int maxSubArray(int[] nums) { int max = n
11
0
0
leetcode115-不同的子序列
摘要:不同的子序列 dp 维护一个二维dp数组,分别表示s[0:i]和t[0:j]的分配种类。 如果j等于0,由于模式串没有进行匹配,那么对于所有的原串来说,都只有一种匹配方式,所以需要赋值1。 然后进行遍历,如果s[i]和t[j]相同,那么有两种选择,匹配或者不匹配,dp[i][j] = dp[i-1]
26
0
0
leetcode44-通配符匹配
摘要:通配符匹配 dp 和正则匹配方法类似。先去处理边界值为0的情况。dp[0][0] = true,同时让j从0到n开始遍历,如果当前的位置是*,那么dp[0][j] = true,因为可以匹配0个字符,否则表明无法继续零匹配,直接跳出循环。 然后进行二维循环,如果当前的匹配串为,那么有两种选择,匹配之
19
0
0
leetcode10-正则表达式匹配
摘要:正则表达式匹配 dp dp[i][j]表示s[0:i]和p[0:j]是否匹配。 如果i == 0 && j == 0,那么说明两个字符串都没有选择字符,是true 如果j == 0,那么说明匹配串没有字符而原字符串有字符,是false 否则,需要根据字符进行分类讨论(注意:i == 0无法判断是tr
17
0
0
leetcode5-最长回文子串
摘要:最长回文子串 中心扩展法 从中心向两侧扩展,分为两种情况:一种是奇数长度,一种是偶数长度,需要分开讨论。 class Solution { public String longestPalindrome(String s) { int n = s.length(), left = 0, right
6
0
0
leetcode42-接雨水
摘要:接雨水 dp 维护两个dp数组,分别记录左侧和右侧的最大值。当前位置的雨水就是左右两侧最大值的较小值减去当前位置的高度,将所有雨水累加即可得到结果。 class Solution { public int trap(int[] height) { int n = height.length, lef
21
0
0
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+
21
0
0
leetcode22-括号生成
摘要:括号生成 回溯 回溯过程中记录cnt,cnt是左括号减去右括号的数量。 如果cnt等于0,那么只能用左括号 如果cnt等于n-k,那么说明只有剩余括号位全是右括号才可以将所有左括号匹配,只能用右括号 除此之外,左右括号都可以 class Solution { List<String> list =
18
0
0
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
37
0
0
leetcode1302-层数最深叶子节点的和
摘要:层数最深叶子节点的和 BFS 层序遍历树,返回最后一次计算的结果 class Solution { public int deepestLeavesSum(TreeNode root) { List<TreeNode> list = new ArrayList<>(); int start = 0,
13
0
0
leetcode132-分割回文串 II
摘要:分割回文串 II 双重dp 首先需要用dp去记录s中回文子串的信息,找出所有的回文子串,方法如上一题。 然后对子串进行拆分,拆分的时候需要用到dp。 对于下标为i这一点,需要去遍历[0, i]这些部分,找出所有以i点结束的回文子串,计算相应的拆分数量,取较小值。 由于最后返回的是分割数量而不是拆分后
16
0
0
leetcode131-分割回文串
摘要:分割回文串 dp+回溯 先通过dp记录子字符串是否为回文串,dp[i][j]表示从i开始到j结束的字符串是否为回文串。注意,i的遍历要从后往前。 然后从0开始进行dfs。在dfs中,找出所有以k为起始字符的回文子串,然后加入路径中,继续进行dfs,直到k == n为止 class Solution
18
0
0
leetcode91-解码方法
摘要:解码方法 dp 如果当前位置的字符串不等于0,则表明这个字符可以被解码成新字符,dp[i] += dp[i-1] 如果上一个位置的字符串等于1或者2并且与当前字符拼接的数字小于等于26,则表明本字符可以是上一个字符遗留下来的,dp[i] += dp[i-2] class Solution { pub
23
0
0
leetcode87-扰乱字符串
摘要:扰乱字符串 dp dp需要记录s1和s2的起始位置和长度,所以是一个三维dp。 dp[i1][i2][len]表示s1从i1位置开始,s2从i2位置开始,长度为len的两个字符串是否和谐。分为以下几种情况: 如果两个字符串相等,返回true 如果字符串不相等,那么从1到len-1的范围内,找出分割点
23
0
0
leetcode85-最大矩形
摘要:最大矩形 dp+单调栈 对每一层维护本列中形成的最高值height,然后对每一层分别计算最大的矩形。 计算每一层最大矩形的时候,先用单调栈记录小于当前位置的左下标和右下标,矩形面积就是(right[i]-left[i]-1) * height[i] class Solution { public i
18
0
0
leetcode712-两个字符串的最小ASCII删除和
摘要:两个字符串的最小ASCII删除和 dp dp[i][j]代表s1[0:i]和s2[0:j]两个字符串的最小删除值。转移方程如下: 如果i == 0且j == 0,则dp[i][j] = 0 如果i == 0或j == 0,则dp[i][j] = dp[i-1][j]+s1.charAt(i-1)或d
30
0
0
leetcode1175-质数排列
摘要:质数排列 分别找出质数和合数的数量,将两者的阶乘相乘即可 class Solution { public int numPrimeArrangements(int n) { int cnt = 0; for(int i = 2; i <= n; i++){ boolean flag = true;
18
0
0
leetcode690-员工的重要性
摘要:员工的重要性 dfs class Solution { Map<Integer, Employee> map = new HashMap<>(); public int getImportance(List<Employee> employees, int id) { for(Employee e
14
0
0
leetcode1033-移动石子直到连续
摘要:移动石子直到连续 分类讨论 class Solution { public int[] numMovesStones(int a, int b, int c) { if(a > b){int t = a; a = b; b = t;} if(a > c){int t = a; a = c; c =
10
0
0
leetcode1656-设计有序流
摘要:设计有序流 数组遍历 维护一个String数组和一个index下标,如果insert插入的idKey-1==index,则将后续字符串依次输出直到遇到null或index==n为止 class OrderedStream { String arr[]; int index = 0; public O
17
0
0
点击右上角即可分享
微信分享提示
深色
回顶
展开