hot100

  1. 无重复字符的最长字串:

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

    • 使用空间换时间:采取set集合去重;
    • 重点在于怎么判断有无重复;
  2. 寻找两个正序数组的中位数

    给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n))

    • 重点是算法的时间复杂度,这个是用二分查找法
    • 原来是我想多了;
  3. 正则表达式匹配

    给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.''*' 的正则表达式匹配。

  4. 括号生成

    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

    • 回溯 + 有效判断;
  5. 下一个排列

    本题要计算「下一个排列」,这类似于计算「下一个不含重复数字的整数」,计算框架应该和「下一个整数」是类似的,具体要怎么做呢

    • 在全排列的基础上更进一步;
    • 思考方向错了;
    • image-20250507165225817
  6. 最长有效括号

  7. 单词拆分 + 322. 零钱兑换

    给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

    • 使用回溯法:超时了;
    • 动态规划:
      • 线性DP:是由之前状态推到出;
      • 序列DP:需要结合题目寻找前驱状态:
        • 本题这里可以转化为背包问题;
          • 字符串是具有一定放入顺序的背包【应该先遍历背包】;
          • 列表则是物体:这里跟物体的顺序没有任何关系【可以放入集合中】;
  8. 课程表

    给你一个有向图,判断图中是否有环。

    动态规划,确定有向无环图,图对象结构;

    1. 入度为0,是起点;
      出度为0,是终点;

    2. 一般:深度优先遍历dfs,判断是否有换;

    3. 三个标记,使用boolean 不行:

      • 访问过的标志;
      • 正在访问的标志;
      • 没有访问的标志;
  9. 打家劫舍 III

    小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root

    • 类似于求树直径的直径,不能回溯,或者递归;

拓扑排序:

​ 给出一个 有向图,把这个有向图转成线性的排序 就叫拓扑排序。

​ 有向无环图结构;

  • 关键在于找到入度[出度为0]和出度[入度为0]的节点;
  • 图的方向和图结构的值【构造对象】
  • 对图节点进行去重 + dfs迭代;;

连续数组之和等于一个定值:

  1. 连续子数组:窗口内的元素必须满足”单调性“;
  2. 前缀和:能够将连续数组的求和优化为O(1);

​ s[i] = s[j] + k; 【i > j】

​ s[j] = s[i] - k; =>等效为一个查询问题HashMap;

  1. 最短无序连续子数组 :

    给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序

    • 三部分,左,右单调,中间无序;
    • 中间的最小 要大于左边的最大【start从右往左找】;
    • 中间的最大:要小于右边的最小【end 从左往右找】;
  2. 任务调度器

    给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长度为 n 的冷却时间。

    返回完成所有任务所需要的 最短时间间隔

    • 这就是一个特殊的排序问题。

    • 结果就是排序的长度;

    • 是找规律,从极端情况下考虑:

      1. 全为相同任务的时候;

      2. 全为不同任务的时候;

      • :(n + 1) * (max - 1) + count;
  3. 字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串。

    编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

    • 一个递归问题;
  4. 戳气球

    n 个气球,编号为0n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

    现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。

    求所能获得硬币的最大数量。

    • 本题是一个区间动态规划的题目;

    • 一般是从前往后推到递推公式,本题是从后往前推到递推公式

    • 递推公式:dp[i][j]:表示开区间i~j范围内,能取得最大值;

      dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j])

    • 注意:必须获取区间中任意子区间的dp[i][j] 的值,所以区间长度和左边界来确定右边界;

  5. 最长有效括号

    给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

    • 在最长子字符串上更进一步;
    • 动态规划,难点找到递推公式;
  6. 删除无效的括号

    给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。

    • 对于括号类的回溯:做括号一定大于等于右括号;
    • 暴力搜索;
  7. 正则表达式匹配

    给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.''*' 的正则表达式匹配。

    • '.' 匹配任意单个字符
    • '*' 匹配零个或多个前面的那一个元素

    所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。

    • 动态规划的一道题,理解正则匹配的底层逻辑;
    • 拆分->怎么能推到递推公式:
      1. 字符为'.':能匹配任意一个字符,均为true;
      2. 字符为'*':能匹配零个或任意个前面的字符;while
      3. 字符为其他:必须一对一匹配;
  8. 最长连续序列

    给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

    请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

    • 重点找两个数:一端,一端小;
    • 通过HashSet解决查询问题,然后找到最小的端就okay;
  9. 单词拆分

    给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

    注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

    • 重点在于对s的的划分,可能存在多种划分【递推】,但是不一定每种都能成功;
    • 采取 双指针 + HashSet ,只能进行一种划分;
    • 采取递归算法 + HashSet,考虑到所有方法,但是超时;
    • 区间动态规划;
posted @ 2025-06-03 20:13  烟雨断桥  阅读(13)  评论(0)    收藏  举报