Leetcode8月11日 打卡

128 阅读3分钟

1.leetcode416题 分割等和子数组

dp问题!! 再次感觉自己对一些边界, padding 处理的特别差!!! 到底怎么样才能突破这块呢???!!!!这个一定要再做几次

看看题解

2.leetcode739题 每日温度

单调栈的题目

还是不够熟练吧! 一个for循环,然后while 去pop 再处理结果数组,push

要注意stack.peek == null 和stack.isEmpty()是不一样的

3.leetcode647题 回文子串的个数

一般涉及到子数组 字符子串

对于每一个中心点 去扩展,分为奇数和偶数去扩展,j = 0 i - j >= 0 && i + j < len && nums[i - j] == nums[i + j] 以及,j = 1 i - j + 1>= 0 && i + j < len && nums[i - j + 1] == nums[i + j] 去扩展

再看看dp的思路 以及那个2N-1个扩展点思路, 不知道这个2n-1 是什么意思

private int result = 0;

public int countSubstrings(String s) {
    for (int i = 0; i < s.length(); i++) {
        countSubstrings(s, i, i);               //回文串长度为奇数
        countSubstrings(s, i, i + 1);     //回文串长度为偶数
    }
    return result;
}

private void countSubstrings(String s, int left, int right) {
    while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
        left--;
        right++;
        result++;
    }
}

这个思路和之前那个第5题的思路特别像!!

leetcode5题 最长回文子串?

和第五题基本是一样的!!

可以用那个方法来直接写!

//dp

状态定义

f(x, y) -------- [x, y]间的子串是否是回文串

状态转移

(1)如果x == y,说明该子串只有一个字符,显然是回文串。

(2)如果x - y == -1,说明该子串只有两个字符,判断是否是回文串就变成了判断这两个字符是否相等。

(3)对于其他情况,当且仅当索引x处的字符和索引y处的字符相等,且[x + 1, y - 1]间的子串是回文串。

时间复杂度和空间复杂度均是O(n ^ 2),其中n为所给字符串的长度。

见代码

4.leetcode516题 最长回文子序列

leetcode5题 最长回文子串?

从小规模的问题去构建大规模的问题

这个是不连续的子数组! 可以用dp来做! 连续的可以用双指针

用长度去枚举len

if(char[i] == char[j]) dp[i]【j】 = dp[i + 1 ]j - 1];

else dp[i]【j] = Math.max ( dp[ i + 1]j]] , dp[i]{j - 1}]])

5.leetcode438题 找到字符串中所有字母异位词

和那个42题 很像,遍历里面所有的可能情况,substring 然后对截取出来的字符串进行重新排序,并且进行比对,如果相同 就记录一下里面的结果

比较好的方法 可能是 hashmap? 那种记录单词的形式,判断里面是否符合 ,什么map++ 什么的,那个题好像是hard级别的!! 待会对比看看

这个题 滑动窗口 有模板的 待会再总结吧!!!

这个题还没弄完!!等待总结!!

6.leetcode621题 最小时间

最小时间 一般就是用贪心

当A的频率很高的时候,也就是最大值很高的时候,必须要用空闲时间来填充

用这个公式 (k - 1)拿出前面K-1个出来 最后的p是和最高频率A相等的个数,会加在最后面

当然有可能出现最高频率A出现的次数很少,此时的task的长度会大于这个公式计算出来的长度,有足够多的task长度时,可以规划完!这时取一个最大值 task长度和公式计算出来的长度 即可

相当于是一个规律总结题吧

贪心算法, 贪心到底是什么意思?

7.leetcode 437题 pathsumIII

先序递归遍历每一个节点,然后以每个节点作为起始节点dfs递归找满足条件结果

还有一个前缀和的思路!!

leetcode-cn.com/problems/pa…