随笔分类 - 算法
记录自己不大熟的LeetCode题目
摘要:题目链接 5. 最长回文子串 思路1:中心扩散法 遍历字符串 s,对于每个字符都以它为中心向两边扩散,测得最长回文子串。 注意:在扩散的过程中要分回文串长度奇偶进行扩散,因为长度为偶数的回文串中心是两个字母 时间复杂度:$O(n^2)$ 空间复杂度:$O(1)$ 代码1 class Solution
阅读全文
摘要:题目链接 680. 验证回文串 II 思路 题目允许删除一个字符,那么当我们判断到一对字符不相等时,可以分别判断区间 $[left + 1, right]$ 和区间 $[left, right - 1]$ 是否能构成回文串,只要有一个能构成回文串,则合法。 代码 class Solution { p
阅读全文
摘要:题目链接 125. 验证回文串 思路 简单双指针应用 代码 class Solution { public boolean isPalindrome(String s) { StringBuffer sgood = new StringBuffer(); int length = s.length(
阅读全文
摘要:题目链接 772. 基本计算器 III 实现一个基本的计算器来计算简单的表达式字符串。 表达式字符串只包含非负整数,算符 +、-、、/ ,左括号 ( 和右括号 ) 。整数除法需要 向下截断 。 你可以假定给定的表达式总是有效的。所有的中间结果的范围均满足 [-231, 231 - 1] 注意:你不能
阅读全文
摘要:题目链接 227. 基本计算器 II 思路 代码 class Solution { // 使用 map 维护一个运算符优先级 // 这里的优先级划分按照「数学」进行划分即可 Map<Character, Integer> map = new HashMap<Character, Integer>()
阅读全文
摘要:题目链接 224. 基本计算器 思路 代码 class Solution { public int calculate(String s) { // 存放所有的数字 Deque<Integer> nums = new ArrayDeque<>(); // 为了防止第一个数为负数,先往 nums 加个
阅读全文
摘要:题目链接 281. 锯齿迭代器 给出两个一维的向量,请你实现一个迭代器,交替返回它们中间的元素。 示例: 输入: v1 = [1,2] v2 = [3,4,5,6] 输出: [1,3,2,4,5,6] 解析: 通过连续调用 next 函数直到 hasNext 函数返回 false, next 函数返
阅读全文
摘要:题目链接 346. 数据流中的移动平均值 给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。 实现 MovingAverage 类: MovingAverage(int size) 用窗口大小 size 初始化对象。 double next(int val) 计算并
阅读全文
摘要:题目链接 409. 最长回文串 思路 遍历字符串过程中统计字符出现个数,如果达到2则说明可以放到回文串的两端,需要 result += 2。 遍历完之后的回文串如果长度小于 s,说明 s 中存在奇数字符,则返回 result + 1。因为放两个奇数字符会破坏回文性。 代码 class Solutio
阅读全文
摘要:题目链接 951. 翻转等价二叉树 思路 如果二叉树 root1,root2 根节点值相等,那么只需要检查他们的孩子是不是相等就可以了。 如果 root1 或者 root2 是 null,那么只有在他们都为 null 的情况下这两个二叉树才等价。 如果 root1,root2 的值不相等,那这两个二
阅读全文
摘要:题目链接 101. 对称二叉树 思路 DFS 递归解决 代码 class Solution { public boolean isSymmetric(TreeNode root) { if(root == null){ return true; } return dfs(root.left, roo
阅读全文
摘要:题目链接 226. 翻转二叉树 思路 将左右子树抽象为两个结点,直接进行交换。然后再递归左右子树。 代码 class Solution { public TreeNode invertTree(TreeNode root) { if(root == null){ return null; } Tre
阅读全文
摘要:题目链接 543. 二叉树的直径 思路 创建全局变量 diameter 以记录左子树高度加右子树高度,并在 DFS 过程中维护此变量。 代码 class Solution { int diameter; public int diameterOfBinaryTree(TreeNode root) {
阅读全文
摘要:题目链接 210. 课程表 II 思路 在 BFS 过程中将所有入度为0的点放入结果集中,如果最终结果集中点的数目和课程数一样,则说明这个结果集可行。 代码 class Solution { public int[] findOrder(int numCourses, int[][] prerequ
阅读全文
摘要:题目链接 207. 课程表 思路 参考Krahets大佬的思路 代码 class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int[] indegrees = new int[numCou
阅读全文
摘要:题目链接 417. 太平洋大西洋水流问题 思路 问题可以转换成从四个边界出发,能和内部哪些点连通。 因为涉及到两个可达性问题,所以用两个 boolean 类型矩阵分别记录一个点到太平洋和大西洋的可达性。 代码 class Solution { public List<List<Integer>> p
阅读全文
摘要:题目链接 542. 01 矩阵 思路 题目让求1到0的距离,其实可以转换成求0到1的距离,将所有的0作为源结点放入队列进行BFS。 BFS本质上就是从源点开始的搜索算法,本题只不过是所有的0都是源点,即多源点,将所有源点放入队列就行。 如果0的旁边没有1,则不会对其周围进行访问;如果0的周围有1,则
阅读全文
摘要:BFS 单向BFS 不记录层数 while queue 不空: cur = queue.pop() for 节点 in cur的所有相邻节点: if 该节点有效且未访问过: queue.push(该节点) 作者:负雪明烛 链接:https://leetcode.cn/problems/01-matr
阅读全文
摘要:题目链接 1091. 二进制矩阵中的最短路径 思路 BFS 找最短路模板题 代码 class Solution { public int shortestPathBinaryMatrix(int[][] grid) { if(grid[0][0] == 1 || grid[grid.length -
阅读全文
摘要:题目链接 752. 打开转盘锁 思路 双向BFS,详见宫水三叶大佬题解。 与拓展题目的思路异曲同工。 代码 class Solution { public int openLock(String[] deadends, String target) { String beginNumber = "0
阅读全文