算法题解
文章平均质量分 76
解析各类数据结构和笔试题的解题思路。
行者无疆_ty
一名被代码耽误的文艺青年。
展开
-
超简单的自动机
本篇博客由力扣第8题引出,这类题目倒是不难,但在不了解自动机之前写出的代码非常臃肿,暴力解需要考虑大量的细节,需要大量的if-else,用了自动机之后才知道什么叫优雅的代码。题目介绍:8. 字符串转换整数 (atoi) 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负原创 2021-11-28 11:56:22 · 187 阅读 · 0 评论 -
双向队列(Deque)在算法题中的应用
本文由剑指offer第59题引出,不了解双向队列之前对这两道题很难有一个很好的解答。首先讲讲Deque的使用://定义Deque<Integer>queue=new LinkedList<>();//插入queue.offerFirst(value);queue.offerLast(value);//删除queue.pollFirst();queue.pollLast();//取队头/尾元素queue.peekFirst();queue.peekLast(原创 2021-11-03 11:37:53 · 273 阅读 · 0 评论 -
从中序与后序、前序与中序遍历序列构造二叉树
从中序与后序遍历序列构造二叉树 中序遍历顺序为:左子节点、根结点、右子节点。 后序遍历顺序为:左子节点、右子节点、根结点。 首先,从二叉树的中序遍历和后序遍历的流程可知,后序遍历数组的最后一个元素代表的即为根节点。知道这个性质后,我们可以利用已知的根节点信息在中序遍历的数组中找到根节点所在的下标,然后根据其将中序遍历的数组分成左右两部分,左边部分即左子树,右边部分为右子树,针对每个部分可以用同样的方法继续递归下去构造。 大致的思路知道了,下面说一下具体的实现: 1.为了高效查找根节点元素原创 2021-04-12 09:41:34 · 307 阅读 · 0 评论 -
图论-并查集算法解决有传递性关系的问题
本篇由力扣第399题引出,部分描述来自官方题解。399. 除法求值 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ?原创 2021-03-01 12:49:17 · 598 阅读 · 0 评论 -
Boyer-Moore投票算法找多数元素
Boyer-Moore可能很多同学并不了解,但你如果百度一下就会发现这是位牛人、大佬,他在1977年提出的BM(Boyer-Moore)算法被认为是最高效的字符串搜索算法, 一般情况下,比KMP算法快3-5倍,因此文本编辑器中的搜索匹配功能,多使用该算法实现。力扣第169题: 多数元素 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:[3,2,3]输出:3原创 2021-01-31 13:33:22 · 195 阅读 · 3 评论 -
HashMap+双向链表实现LRU缓存机制
学过操作系统的同学应该知道,LRU指的是最近最久未使用页面置换算法,即容量填满时将最近最久未使用的对象删除。在Java中有着LinkedHashMap类,底层就是用双向链表+HashMap实现的,今天就教大家如何手撕LRU缓存机制。leetcode 146. LRU 缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存原创 2021-01-27 15:14:52 · 646 阅读 · 1 评论 -
巧用快慢指针找出链表中的环结构
很多同学可能都还没用过快慢指针,这次就带你们见识一下。这篇文章是由leetcode第141题和第142题引出的。先来容易的,判断链表中是否存在环结构:141.给定一个链表,判断链表中是否有环 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 如果链表中存在原创 2021-01-26 12:22:35 · 312 阅读 · 0 评论 -
你不知道的“异或”神操作
这是我在解答leetcode第136题时的感悟,这是一到简单题,解答其实不难,但要满足题目要求的线性时间复杂度和不使用额外空间就有点难了,在这道题的解答中,“异或”会让你见识到什么叫神操作。136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出原创 2021-01-24 13:14:20 · 150 阅读 · 0 评论 -
巧用递归构造二叉树
leetcode第105题:从前序与中序遍历序列构造二叉树难度:中等;通过率:68%注意:你可以假设树中没有重复的元素。例如,给出:前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:解题思路 绝大多数二叉树的题目,都能够使用递归的思想来解决,所以面对二叉树类的题目,首先应该想到递归,这样不仅可以省去大量的if-else操作,也能使得代码简洁明了。对于这个题,我们应该明确的一个主要思路是: 前序遍历的顺原创 2021-01-22 11:59:40 · 408 阅读 · 2 评论 -
彻底吃透二叉树的遍历算法
二叉树是数据结构中最为基础的类型,其变种丰富,如二叉排序树、红黑树、B树、B+树、哈夫曼树等等,其应用场景广泛,如数据压缩、内存管理、文件系统、数据搜索。因此其遍历方法是我们必须要掌握的。 二叉树的遍历分为三种:先序遍历、中序遍历、后序遍历。这里的顺序是针对根结点而言的,即: 先序遍历:中左右。先处理根结点–>再处理左子节点–>最后处理右子节点。如上图所示,先序遍历结果为:ABDFECGHI 中序遍历:左中右。先处理左子节点–>再处理根结点–>最后处理右子节点。原创 2021-01-15 12:43:28 · 453 阅读 · 1 评论 -
灵活使用链表解题
链表是数据结构中最基本的一种结构,也有着广泛的应用,如在Java中的HashMap,在JDK 1.8 以前 的实现是 数组+链表,JDK 1.8 以后的实现是链接+红黑树。灵活使用链表,可以为我们节省大量的时间,解决各类实际应用题。 本文主要讲解leetcode两个算法题中链表的灵活应用,所用解法皆击败了100%的用户。一、旋转链表第61题;难度中等;通过率40.6% 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->原创 2021-01-13 11:50:59 · 153 阅读 · 1 评论 -
超简单的动态规划解决可达路径算法题(击败100%的用户)
看到与路径规划相关的题目我们首先应该想到的就是动态规划,动态规划解决不了的问题再考虑使用二叉树搜索,树搜索采用穷尽搜索所有路径,尽管可添加剪枝的策略,但在效率上和可理解性上还是不如动态规划的。动态规划的总体思路是以空间换时间,如下面的两个题中,我们都使用与输入数组相同大小的数组记录每个位置的可达路径数,然后遍历一次数组即可。另外,动态规划最最重要的就是找到递推公式,找准了公式,题就出来一半了。话不多说,直接上题:一、lee原创 2020-12-29 12:01:18 · 974 阅读 · 0 评论 -
与括号有关的算法题解
一、生成括号问题(动态规划) 对于这类问题,只需要抓住一条准则:左括号必须大于等于右括号。 然后按照以下步骤进行即可求解出所有有效括号。 1.做好参数校验,即处理括号数为0或1的情况; &原创 2020-12-21 11:41:24 · 371 阅读 · 0 评论