六月份抄题

139.单词拆分

思路:

    dp[i]表示s前i个字符能否完全拆分为wordDict中的"某几个单词"(即:未必是全部)

https://leetcode-cn.com/problems/word-break/solution/shou-hui-tu-jie-san-chong-fang-fa-dfs-bfs-dong-tai/


知识点:

  1. s.substring(statr,end)方法:用于提取字符串中介于两个指定下标之间的字符(前闭后开),如果省略end参数,那么返回的子串会一直到字符串的结尾。
  • 举例:
    str="Hello world!"
    st = str.substring(3); //st = lo world!
  1. Java的String.substring为什么能够处理str.length?
  • st = str.substring(3,str.length()); // st= lo world!
  • 不会抛出数组角标越界:只要str.substrin()中的角标不大于str.length()。。。。
    ——————————————————————————————————————————————————————————————————————————————

85. 最大矩形

思路:

——————————————————————————————————————————————————————————————————————————————

98. 验证二叉搜索树

思路:中序遍历

  • 二叉搜索树「中序遍历」得到的值构成的序列一定是升序的,这启示我们在中序遍历的时候实时检查当前节点的值是否大于前一个中序遍历到的节点的值即可。如果均大于说明这个序列是升序的,整棵树是二叉搜索树。

解答:

——————————————————————————————————————————————————————————————————————————————

124. 二叉树中的最大路径和

思路:

  1. 递归一个树,会对每个子树做同样的事(你写的处理逻辑)。

  2. 通过求出每个子树对外提供的最大路径和(return出来给父节点),从递归树底部向上,求出每个子树内部的最大路径和,后者是求解的目标,它的求解需要子树提供的值,理解清楚二者的关系。

  3. 每个子树的内部最大路径和,都挑战一下最大纪录,递归结束时,最大纪录就有了。

  4. 思考递归问题,不要纠结细节实现,结合求解的目标,自顶而下、屏蔽细节地思考。随着递归出栈,子问题自下而上地解决,最后解决了整个问题,内部细节是子递归帮你去做的。

  5. 你要做的只是写好递归的处理逻辑,怎么处理当前子树?需要返回东西吗?返回什么?再设置好递归的出口。其实就是——正确定义递归函数。

  6. 没有思路的时候,试着画画递归树找思路。即便做对了,画图也能加深理解。

——————————————————————————————————————————————————————————————————————————————

146. LRU 缓存机制

思路:借助哈希表赋予了链表快速查找的特性:可以快速查找某个 key 是否存在缓存(链表)中,同时可以快速删除、添加节点。

  • 要让 put 和 get 方法的时间复杂度为 O(1),我们可以总结出 cache 这个数据结构必要的条件:查找快,插入快,删除快,有顺序之分。

  • cache 必须有顺序之分,以区分最近使用的和久未使用的数据;而且我们要在 cache 中查找键是否已存在;如果容量满了要删除最后一个数据;每次访问还要把数据插入到队头。

  • 那么,什么数据结构同时符合上述条件呢?哈希表查找快,但是数据无固定顺序;链表有顺序之分,插入删除快,但是查找慢。所以结合一下,形成一种新的数据结构:哈希链表。

  • LRU 缓存算法的核心数据结构就是哈希链表,双向链表和哈希表的结合体。
    ——————————————————————————————————————————————————————————————————————————————

3. 无重复字符的最长子串

思路:滑动窗口

        1、首先,判断当前字符是否包含在map中,如果不包含,将该字符添加到map(字符,字符在数组下标),
         此时没有出现重复的字符,左指针不需要变化。此时不重复子串的长度为:i-left+1,与原来的maxLen比较,取最大值;

        2、如果当前字符 ch 包含在 map中,此时有2类情况:
         1)当前字符包含在当前有效的子段中,如:abca,当我们遍历到第二个a,当前有效最长子段是 abc,我们又遍历到a,
         那么此时更新 left 为 map.get(a)+1=1,当前有效子段更新为 bca;
         2)当前字符不包含在当前最长有效子段中,如:abba,我们先添加a,b进map,此时left=0,我们再添加b,发现map中包含b,
         而且b包含在最长有效子段中,就是1)的情况,我们更新 left=map.get(b)+1=2,此时子段更新为 b,而且map中仍然包含a,map.get(a)=0;
         随后,我们遍历到a,发现a包含在map中,且map.get(a)=0,如果我们像1)一样处理,就会发现 left=map.get(a)+1=1,实际上,left此时
         应该不变,left始终为2,子段变成 ba才对。

         为了处理以上2类情况,我们每次更新left,left=Math.max(left , map.get(ch)+1).
         另外,更新left后,不管原来的 s.charAt(i) 是否在最长子段中,我们都要将 s.charAt(i) 的位置更新为当前的i,
         因此此时新的 s.charAt(i) 已经进入到 当前最长的子段中!


——————————————————————————————————————————————————————————————————————————————

438. 找到字符串中所有字母异位词

  • 思路:以滑动窗口求解
    • 关于 Arrays.equals(sCnt, pCnt) 的用法:
    1. 时间复杂度:是O(n),n是数组长度,对于常数级别的复杂度,就是O(1)。只有n可能很大的情况下才会是O(n)
    2. 方法比较的是两个数组的内容是否相等

——————————————————————————————————————————————————————————————————————————————

406. 根据身高重建队列

——————————————————————————————————————————————————————————————————————————————

55. 跳跃游戏

https://leetcode-cn.com/problems/jump-game/solution/55-by-ikaruga/

  • 思路:
    1. 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。
    2. 可以对每一个能作为起跳点的格子都尝试跳一次,把能跳到最远的距离不断更新。
    3. 如果可以一直跳到最后,就成功了。
    • 这种方法所依据的核心特性:如果一个位置能够到达,那么这个位置左侧所有位置都能到达。

——————————————————————————————————————————————————————————————————————————————

15. 三数之和

https://leetcode-cn.com/problems/3sum/solution/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/

算法流程:

  1. 特判,对于数组长度 nn,如果数组为 nullnull 或者数组长度小于 33,返回 []。
  2. 对数组进行排序。
  3. 遍历排序后数组:
    • 若 nums[i]>0nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 00,直接返回结果。
    • 对于重复元素:跳过,避免出现重复解
    • 令左指针 L=i+1L=i+1,右指针 R=n-1R=n−1,当 L<RL<R 时,执行循环:
      * 当 nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,RL,R 移到下一位置,寻找新的解
      * 若和大于 00,说明 nums[R]nums[R] 太大,RR 左移
      * 若和小于 00,说明 nums[L]nums[L] 太小,LL 右移
posted @ 2021-06-08 10:54  BigMonster85  阅读(104)  评论(0)    收藏  举报