hot100
-
无重复字符的最长字串:
给定一个字符串
s,请你找出其中不含有重复字符的 最长 子串 的长度。- 使用空间换时间:采取set集合去重;
- 重点在于怎么判断有无重复;
-
寻找两个正序数组的中位数
给定两个大小分别为
m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为O(log (m+n))- 重点是算法的时间复杂度,这个是用二分查找法;
- 原来是我想多了;
-
正则表达式匹配
给你一个字符串
s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。 -
括号生成
数字
n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。- 回溯 + 有效判断;
-
下一个排列
本题要计算「下一个排列」,这类似于计算「下一个不含重复数字的整数」,计算框架应该和「下一个整数」是类似的,具体要怎么做呢
- 在全排列的基础上更进一步;
- 思考方向错了;
-
最长有效括号
-
单词拆分 + 322. 零钱兑换
给你一个字符串
s和一个字符串列表wordDict作为字典。如果可以利用字典中出现的一个或多个单词拼接出s则返回true。- 使用回溯法:超时了;
- 动态规划:
- 线性DP:是由之前状态推到出;
- 序列DP:需要结合题目寻找前驱状态:
- 本题这里可以转化为背包问题;
- 字符串是具有一定放入顺序的背包【应该先遍历背包】;
- 列表则是物体:这里跟物体的顺序没有任何关系【可以放入集合中】;
- 本题这里可以转化为背包问题;
-
课程表
给你一个有向图,判断图中是否有环。
动态规划,确定有向无环图,图对象结构;
-
入度为0,是起点;
出度为0,是终点; -
一般:深度优先遍历dfs,判断是否有换;
-
三个标记,使用boolean 不行:
- 访问过的标志;
- 正在访问的标志;
- 没有访问的标志;
-
-
打家劫舍 III
小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为
root。- 类似于求树直径的直径,不能回溯,或者递归;
拓扑排序:
给出一个 有向图,把这个有向图转成线性的排序 就叫拓扑排序。
有向无环图结构;
- 关键在于找到入度[出度为0]和出度[入度为0]的节点;
- 图的方向和图结构的值【构造对象】
- 对图节点进行去重 + dfs迭代;;
连续数组之和等于一个定值:
- 连续子数组:窗口内的元素必须满足”单调性“;
- 前缀和:能够将连续数组的求和优化为O(1);
s[i] = s[j] + k; 【i > j】
s[j] = s[i] - k; =>等效为一个查询问题HashMap;
-
最短无序连续子数组 :
给你一个整数数组
nums,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序- 三部分,左,右单调,中间无序;
- 中间的最小 要大于左边的最大【start从右往左找】;
- 中间的最大:要小于右边的最小【end 从左往右找】;
-
任务调度器
给你一个用字符数组
tasks表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长度为n的冷却时间。返回完成所有任务所需要的 最短时间间隔
-
这就是一个特殊的排序问题。
-
结果就是排序的长度;
-
是找规律,从极端情况下考虑:
-
全为相同任务的时候;
-
全为不同任务的时候;
- :(n + 1) * (max - 1) + count;
-
-
-
字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为:
k[encoded_string],表示其中方括号内部的encoded_string正好重复k次。注意k保证为正整数。- 一个递归问题;
-
戳气球
有
n个气球,编号为0到n - 1,每个气球上都标有一个数字,这些数字存在数组nums中。现在要求你戳破所有的气球。戳破第
i个气球,你可以获得nums[i - 1] * nums[i] * nums[i + 1]枚硬币。 这里的i - 1和i + 1代表和i相邻的两个气球的序号。如果i - 1或i + 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] 的值,所以区间长度和左边界来确定右边界;
-
-
最长有效括号
给你一个只包含
'('和')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。- 在最长子字符串上更进一步;
- 动态规划,难点找到递推公式;
-
删除无效的括号
给你一个由若干括号和字母组成的字符串
s,删除最小数量的无效括号,使得输入的字符串有效。- 对于括号类的回溯:做括号一定大于等于右括号;
- 暴力搜索;
-
正则表达式匹配
给你一个字符串
s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.'匹配任意单个字符'*'匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串
s的,而不是部分字符串。- 动态规划的一道题,理解正则匹配的底层逻辑;
- 拆分->怎么能推到递推公式:
- 字符为'.':能匹配任意一个字符,均为true;
- 字符为'*':能匹配零个或任意个前面的字符;while
- 字符为其他:必须一对一匹配;
-
最长连续序列
给定一个未排序的整数数组
nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为
O(n)的算法解决此问题。- 重点找两个数:一端,一端小;
- 通过HashSet解决查询问题,然后找到最小的端就okay;
-
单词拆分
给你一个字符串
s和一个字符串列表wordDict作为字典。如果可以利用字典中出现的一个或多个单词拼接出s则返回true。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
- 重点在于对s的的划分,可能存在多种划分【递推】,但是不一定每种都能成功;
- 采取 双指针 + HashSet ,只能进行一种划分;
- 采取递归算法 + HashSet,考虑到所有方法,但是超时;
- 区间动态规划;

浙公网安备 33010602011771号