刷题上岸之路
文章平均质量分 67
Ben土豆
这个作者很懒,什么都没留下…
展开
-
[模版总结] - 树的基本算法1 - 遍历
二叉树基础总结,遍历篇原创 2023-11-10 10:08:58 · 103 阅读 · 0 评论 -
[亚麻高频题] - 最大重复元素处理问题
这道题目属于一道模拟题,基本思路就是创建一个HashMap<Integer, LinkedList<Integer>> 来维护数组中数值以及元素对应的位置信息,然后可以创建一个大顶堆来维护重复元素,每一次循环,取出堆中最大元素,找到对应链表中最靠前的两个index,从链表中删除这两个位置,将第二个元素除以2后更新到对应链表中,注意每一个链表要保证有序,所以如果每一次插入链表时要逐个进行比较然后插入。最大重复元素 6,去掉第一个,第二个除以2,数组变为[3, 6, 1, 2, 2]原创 2023-08-21 13:26:41 · 91 阅读 · 0 评论 -
[模版总结] - 集合划分类DFS模版
不难理解,在递归寻找解的过程中,有很多重复解的情况,比如桶1选择2,3,4号球,桶2选择5,6号球,这种情况和桶1选择5,6号球,桶2选择2,3,4号球是重复情况。- 思路很简单,每一层递归是给当前数字选择一个子集合,如果当前子集合超过等分值那么跳过,直到所有数字选完子集合后,比较子集合中是否相等即可。集合划分也是思路和排列组合类似,可以想象成给球分桶的问题,这种类型的题目通常有两个思考方式:给每一个球选桶,给每一个桶选球。这里的球就是指集合中的每一个数,而桶则是指等分的每一个子集合。原创 2023-07-28 15:22:36 · 203 阅读 · 0 评论 -
[Leetcode刷题] - LC 2770 达到末尾下标所需的最大跳跃次数
这道题目是跳跃游戏的改进版,思路和跳跃游戏一致,最简单的思路就是利用DFS暴力枚举所有情况,每一次递归中,遍历后继点,当后继点和当前点差值绝对值原创 2023-07-25 09:21:01 · 106 阅读 · 0 评论 -
[模板总结] - 拓扑排序
有向图邻接表和入度计算完成后,即可使用类似BFS方法进行遍历,创建一个队列进行存储,如果有节点入度为0那么就将该节点加入队列,然后找出与该节点相邻节点并将他们的入度-1,如果有新的入度为0的点出现继续加入队列直到为空为止。注:如果是有环形结构,那么你在拓扑排序可能会出现死循环,因为环形结构两个节点会不断进入队列。但也可以解决,可以设置一个阈值,如果加入队列节点个数超过了图中节点个数说明环形存在,即刻跳出。中以图中节点依赖关系对节点进行排序。1. 入度:每一个节点的入度可以理解为指向这个节点的节点个数。原创 2023-07-11 15:46:30 · 93 阅读 · 0 评论 -
[DoorDash面试题] - 饭店开门关门时间
基本套路就是先处理时间,将“hh:mm”转化为分钟,起始时间:5-(总分钟%5) + 总分钟;终止时间:总分钟 - (5-(总分钟%5))。给定一个开门和关门时间,格式为“mon 11:22 am”,计算出在这段时间之内所有以5mins为单元的时间列表。然后将这个区间内所有5mins为单位的时间找出,列入最终结果即可。没找到Leetcode原题,应该是一道doordash改编题。原创 2023-06-27 13:08:47 · 551 阅读 · 0 评论 -
[Leetcode刷题] - LC946 Validate Stack Sequences
本题考查对于Stack工作原理的理解,Stack出栈顺序是后进先出(LIFO),加入一个数组进栈顺序 [1,2,3,4,5],那么出栈就是[5,4,3,2,1], 如果期望出栈顺序是[4,5,3,2,1],那么必须在5进栈之前,要把4 pop出去。所以这道题整体思路就是一次将数字push进栈,设置一个指针记录当前出栈数字,如果进栈数==出栈数,那么将该数字pop,并且指针后移一步,最后判断指针是否指向末尾。原创 2023-05-24 03:03:52 · 38 阅读 · 0 评论 -
[Leetcode刷题] - LC322 Coin Change
题目链接:给定几种coins数额,假定每一种coin可以无限次使用,给定一个数额amount,问能加和成这个数额的最小coin的个数。原创 2023-05-23 04:51:08 · 80 阅读 · 0 评论 -
[Leetcode刷题] - LC075 Sort Colors
一个随机序列包含0,1,2 在不占用额外内存的情况下将序列排序。原创 2023-05-20 12:55:35 · 366 阅读 · 0 评论 -
[Leetcode刷题] - LC017 Letter Combination of a Phone Number
第一项是存储局部字符组合O(N), 第二项是由于我们每一次递归都将当前局部字符组合保存成tmp用于回溯,所以额外开的空间,这样的优点时,省去了每一次直接在字符上增删的O(N)耗时。这是一道Yahoo高频题,电话按键2-9每一个数字对应3-4个字母,现在问询给一个数字组合,返回所有可能的字母组合。一道经典DFS暴力搜索的题目,在递归过程中定义一个变量来保存当前的组合字符。组合树状结构的空间,最坏情况是所有数字都是7,9全部4中选择;,额外只需要开StringBuilder的空间即可。原创 2023-05-20 04:50:32 · 48 阅读 · 0 评论 -
[OOD设计] - 图书馆系统
基于基本功能,需要数据库来保存大量信息包括书籍,书架,用户,预约信息,这里将数据库简化成HashMap形式。当然真正的一个图书馆系统还应该具备下面这些功能,我们这里只实现上述基本功能。书籍类中包含书籍名称,ID,类别,书籍所在书架位置,以及借阅信息类。包括用户ID,当前持有书籍等一些基本用户信息。用于保存书籍的位置信息,以及查找函数。书架类 + 书架系统类。原创 2023-05-18 12:57:13 · 302 阅读 · 0 评论 -
[OOD设计] - 电梯系统设计
OOD设计总结 - 电梯系统设计原创 2023-05-16 14:49:31 · 755 阅读 · 0 评论 -
[Leetcode刷题] - LC005 最长回文子串
Leetcode 005 题解 - 最长回文子串原创 2022-11-22 14:56:45 · 57 阅读 · 0 评论 -
[Leetcode刷题] - LC003 Longest Substring without repating character
Leetcode 003题解原创 2022-11-22 13:33:59 · 171 阅读 · 0 评论 -
[Leetcode刷题] - LC002. Add Two Numbers
Leetcode 002 题解原创 2022-11-15 16:24:10 · 121 阅读 · 0 评论 -
[Leetcode刷题] - LC001. TwoSum
Two Sum求解原创 2022-11-15 07:52:47 · 52 阅读 · 0 评论 -
[Twitter高频题] - Leetcode 453. Minimum Moves to Equal Array Elements
题目链接Leetcode 453.简单理解一下题目,定义一个move的操作,可以给数组中n-1个元素都同时加1,问最少move操作能是数组所有元素相同。题目思路1.暴力求解 -会超时正向思维那么我们每一次move操作的时候,给除最大值以外的所有值加1,直到最大值与最小值相等,也就是所有值相同。时间复杂度会超时。class Solution { public int minMoves(int[] nums) { int res = 0; ...原创 2022-03-25 04:39:56 · 569 阅读 · 0 评论 -
[Twitter高频题] - Leetcode1817. Find User Active Minutes
题目链接Leetcode 1817.:题目描述迷惑性有点高,简单白话解释一下,题目输入是一个二维数组,每一个元素对应一个user在某分钟活跃的记录,[1,5]就是指ID=1的用户在5分钟这个时间有活跃过。然后定义了一个名词UAM(User Active Minutes) -是指一个用户一共在那些分钟活跃过的总和,比如用户ID=1在min=2, min=5, min=5活跃过,那么他的UAM = 2 (重复分钟只统计一次)。然后最后问题想让你统计每一个UAM对应多少用户。题目思路这道题就...原创 2022-03-28 23:04:19 · 448 阅读 · 0 评论 -
[模板总结] - 二分查找
模板题目链接Leetcode 34. Find First and Last Position of Target:二分法最重要的两个模板,一个找满足条件的第一个值,一个是找满足条件的最后一个值。二分查找思路Binary Search可以通过递归和迭代两种方式实现,这里介绍迭代写法。二分查找首先前提是数组有序,并且是能够通过条件将结果分成两部分 —— 满足或者不满足。二分查找的应用归根到底就是两种:找满足条件的第一个值 基本思路:每一次循环选择当前区间中点,如果,指针向中点及其左边...原创 2022-02-24 12:54:52 · 242 阅读 · 0 评论 -
[模板总结] - 归并排序思想
模板题目链接Lintcode 454. Sort Array:归并排序Leetcode 23. Merge K sort-lists:K路归并问题归并排序思路归并思路很好理解,以两个数组归并来举例,开一个新数组来保存新的合并结果,两个原始数组(需要保证两个原始数组有序)从头开始比较,哪个比较小就加入合并数组中,最后就是排序后结果。对于归并排序问题,由于原始数组非有序,所以需要利用分治思想将原始数组分解到有序数组,也就是单一元素数组自身是有序,通过合并小问题来最终解决两个原始数组合...原创 2022-02-24 11:56:27 · 782 阅读 · 0 评论 -
[模板总结] - 双指针
题目描述 & 链接LintCode 228. 链表中点-同向双指针LintCode 31. Partition Array-相向双指针LintCode 200. Longest Palindromic Substring-背向双指针具体思路1.同向双指针同向双指针通常解题思路就是一个主指针,一个辅助指针,主指针每次循环中一般走一步,每一次循环中辅助指针不断向前扫描,典型同向双指针:快慢针找某个位置 KMP算法扫描的过程也类似同向双指针 归并排序快...原创 2022-02-24 08:14:01 · 443 阅读 · 0 评论 -
[亚麻高频题] Leetcode 426. Convert Binary Search Tree to Sorted Doubly Linked List (BST转换成双链表)
题目描述 & 链接Leetcode 426:将BST结构转化成双链表结构,使得每一个节点连接他的前驱结点和后继节点,并且头,尾两个节点也要相连。要求不开额外空间题目思路这道题我给点个赞,让我对于中序遍历DFS模板有了更深刻的理解。首先如果可以开额外空间的话怎么做?以为二叉树中序遍历有个隐藏性质:中序遍历中当前节点上一个点即为前驱节点,下一个点即为后继节点。那么可以将BST结构以中序遍历顺序,保存并遍历该数组让每一个点与左右相连即可。如果不使用额外空间应该如何做。我们先看一下BST..原创 2022-02-14 08:05:38 · 334 阅读 · 0 评论 -
[模板总结] - 二叉搜索树 BST - 基础篇
模板题目链接BST查找 -Leetcode 270. Closest BST Value BST插入 -Leetcode 701. Insert Node in BST BST删除 -Leetcode 450. Delete Node in BST二叉搜索树-BST 概述BST是二叉树的一种,具备二叉树的结构性质:只有一个Root节点,每一个节点最多可以有左右两个子节点。BST自身的性质:每一个节点的左儿子数值一定比他小,右儿子的数值一定比他大。这个性质也使得BST的中序遍历输出结果是一...原创 2022-02-14 01:32:12 · 353 阅读 · 0 评论 -
[亚麻高频题] Leetcode 1597. Build Binary Expression Tree From Infix Expression (中缀表达式构造二叉表达式树)
题目描述 & 链接Leetcode 1597:根据计算表达式生成二叉树,使得二叉树的中序遍历结果与计算表达式相同题目思路对于计算表达式的题目,通常能使用双栈思路求解,这道题思路与Leetcode 772. Basic Calculator III (计算器 III)基本相同,唯一不同只是处理结果上,之前直接计算出结果即可,这里需要建成二叉树节点,所以数字栈保存的是当前树节点,计算过程是将栈顶pop出来,作为树根,将数字栈pop出两个节点作为左右叶子节点,与树根相连,然后将该树根重新加..原创 2022-02-10 05:09:53 · 7392 阅读 · 0 评论 -
[亚麻高频题] Leetcode 772. Basic Calculator III (计算器 III)
题目描述 & 链接Leetcode 772:是Leetcode 224. Basic Calculator(计算器)题目的进阶版,给定一个计算表达式,运算符包括左右括号,"+ - * /"运算,求最后计算结果题目思路与Leetcode 224. Basic Calculator(计算器)是相同的,利用双栈(符号栈,数字栈)求解,具体可以参考前面链接,唯一需要改进的是加入乘法和除法并分配为最高优先级,在维护符号栈时,当新符号优先级比栈顶小或相同时,触发计算,直到栈顶空或者比当前有限...原创 2022-02-10 04:39:45 · 1117 阅读 · 0 评论 -
[亚麻高频题] Leetcode 224. Basic Calculator(计算器)
题目描述 & 链接Leetcode 224:给点一个String表达式 "1 + 2 - 3"返回最后的计算结果,运算符有+/-, ()数值存在负数。题目思路基本表达式计算类问题的通用思路,就是采用双栈,一个栈保存运算符号和括号,一个栈来保存数字。需要注意的是符号栈根据优先级维护一个单调递增栈,首先定义运算符的优先级:"(" 是1优先级; "+","-"是2优先级。基本思路遍历每一个字符,当遇到"("进符号栈,当找到")"时开始进行数字运算,直到符号栈栈顶...原创 2022-02-10 02:02:39 · 199 阅读 · 0 评论 -
[模板总结] - Dijkstra 最短路径求解
模板题链接Leetcode 743. 网络延迟时间经典练习题787. Cheapest Flights Within K Stops1928. Minimum Cost to Reach Destination in TimeDijkstras算法介绍1. 最短路径算法概述在图论问题中最为经典问题之一就是求最短路径问题,今天我们主要来讨论单源点最短路径问题,求解最短路径问题首先我们需要理解问题中图的类型,通常来说构建图会有下面几种情况 无边权DAG: 也就是拓扑图,这种图的原创 2022-02-06 06:58:00 · 369 阅读 · 0 评论 -
[OOD设计] - Pub Sub Pattern (观察者设计模式)
题目描述 & 链接Lintcode. Pub-Sub Pattern: 构建一个观察者模型,实现下面问询:1.让用户订阅;2.让用户取消订阅;3.给某频道发送信息,所有订阅该频道的用户都会收到题目思路思路比较简单,可以建立一个HashMap,保存每一个channel对应订阅的用户,然后每一次发送信息就枚举所有订阅用户发送即可,这里需要注意我们可以选择ArrayList来保存用户,但是问题是:1.查重不好处理;2. 删除操作需要。因此这里使用 HashMap<String, Has.原创 2022-02-03 09:47:13 · 330 阅读 · 0 评论 -
[OOD设计] - Black Jack Game (21点)
题目描述&链接21点游戏OOD设计:设计一个可以多人在线的21点游戏,一个游戏室会有一个荷官(发牌员),多名玩家,一条牌组。每一名玩家用手里的牌与发牌员比大小,谁越接近21点,谁就算赢。如果你的牌是一个Ace + 10的话,那么你就是Black Jack也就是游戏中最大牌。题目结构设计梳理作为一个初学者,一开始看这道题着实是没有什么思路,不知道从哪里下手,而且看了网上一些设计,写的确实很好,但是我认为功能过于完善,我并不认为在面试20分钟的时间内,能够做到那种完美的设计。我这篇文章主要的原创 2022-02-03 05:48:44 · 927 阅读 · 0 评论 -
[亚麻高频题] Leetcode 239. Sliding Window Maximum(滑动窗口最大值)
题目描述 & 链接Leetcode 239. Sliding Window Maximum:定义一个窗口大小,求数组从头到尾窗口区域内最大值。题目思路:1. 单调栈这道题目我们需要维护两个东西:一个是区域内最大值;另一个是如果窗口滑动导致当前最大值失效后,潜在的最大值。第一个区间最大值,可以直接以打擂台方式维护,但是潜在最大值我们则需要以大小顺序保存在后面。这里我们可以使用单调栈来进行维护。单调递增递减栈都可以,如果递减栈最大值保存在尾部,然后新加入的元素,根据单调递减关系保存在头.原创 2022-02-01 23:32:23 · 930 阅读 · 0 评论 -
[亚麻高频题] Leetcode 151. Reverse Words in a String(翻转字符串)
题目描述 & 链接Leetcode 151. Reverse Words in a String:将一个包含多个单词的字符串按单词顺序翻转题目思路题目比较直截了当,就是将所有单词逆序组合成最后结果,先通过空格进行分割,然后从后往前遍历合成即可,这里题目说单词之间原先可能存在多个空格,那么分割后的结果存在两种情况:1.空元素(开头,结尾存在空格);2.元素是空格(单词之间有过个空格时)。代码如下:class Solution { public String reverse原创 2022-02-01 22:11:36 · 508 阅读 · 0 评论 -
[亚麻高频题] Leetcode 901. Online Stock Span(在线股票价格跨度)
题目描述&链接Leetcode 901. Online Stock Span:在线接收股票价格,返回前面连续天数股票价格比当前低题目思路1. 暴力枚举寻找比当前元素大的上一个元素位置,又是单调栈思路,不同的是这次输入是Stream输入。最简单粗暴的方法就是从当前位置遍历前面位置,当发现大于当前元素的位置,记录天数。每一次操作时间复杂度:, 空间复杂度:。2. 单调栈该题目的问询明显可以使用单调栈进行求解,但是如果直接按照单调栈模板套用的话,每次操作时间复杂度依然是。如果通..原创 2022-02-01 12:35:46 · 247 阅读 · 0 评论 -
[亚麻高频题] Leetcode 739. Daily Temperatures(每日温度)
题目描述&链接Leetcode 739. Daily Temperatures:一个数组记录每日的温度,输出一个数组每一个元素代表下一个比当前温度高的天数题目思路单调栈经典应用,寻找比当前元素更高的下一个元素位置,维护一个单调递减栈,如果出现比栈顶元素大的新元素,那么就把比新元素小的栈内元素pop出来,当前元素即为这些元素更大的下一个元素位置。Java中使用Stack推荐使用Deque,Java源码对于Deque进行了优化,有效提高了运行速度。代码如下:class Solu..原创 2022-02-01 12:09:11 · 424 阅读 · 0 评论 -
[亚麻高频题] Leetcode 503. Next Greater Element II(下一个大的元素)
题目描述 & 链接Leetcode 503. 下一个更大元素题目思路1. 单调栈单调栈经典应用 -寻找下一个更大元素的位置,这道题不同的是数组是一个循环数组,也就是下一个更大元素位置也可以在当前元素前面。所以不仅要查看后面的元素,也要查看前面元素,对于循环数组的处理一般是将数组拼接成两份,这样循环数组的每一个值都会在当前元素位置中出现一次。然后算法思路根据单调栈模板就可以实现。代码如下:class Solution { public int[] nextGrea..原创 2022-02-01 11:49:27 · 307 阅读 · 0 评论 -
[模板总结] - 单调栈
模板题&链接Leetcode 907. Sum of Subarray MinimumsLeetcode 901. Online Stock SpanLeetcode 496. Next Greater ElementLeetcode 503. Next Greater Element IILeetcode 739. Daily TemperaturesLeetcode 239. Sliding Window Maximum单调栈定义是指一个栈内保存的元素满足单调递增原创 2022-02-01 11:34:36 · 164 阅读 · 0 评论 -
[亚麻高频题] Leetcode 973. K Closest Points to Origin(离原点K个最近的点)
题目描述 & 链接Leetcode 973. K Closest Points to Origin题目思路1. 改写Comparator进行排序这道题目思路比较直观,就是直接对每个点距离进行排序,取TopK个元素,这道题考察Java如何改写比较器。class Solution { public int[][] kClosest(int[][] points, int k) { // comparator 改写 Arrays.sort(po原创 2022-02-01 11:17:38 · 5225 阅读 · 0 评论 -
[模板总结] - 快速选择 (霍尔Quick Selection)
模板题目 & 链接Leetcode 215 Kth Largest Element 第K大的元素Leetcode 347. Top K Frequent Elements TopK高频元素基本思路:快速选择是快速排序算法的衍生品,当对数组进行partition分组时,实际上就是将比pivot大或者小的分成一组,加入pivot数组在整个数组中是第K大的元素,那么partition后pivot之前就是前K-1大的元素集合,只是顺序不确定。根据这个快速排序partition的性质,可以引出原创 2022-01-31 12:37:56 · 506 阅读 · 0 评论 -
[模板总结] - 快速排序
模板题&链接Leetcode 912 - 数组排序快速排序思路和归并排序的思想,我们也是通过分治法来实现从局部有序最后全局有序,但是与归并排序不同的是,归并排序先分治出最小子问题(两个单一元素数组归并),先得到最小子问题合并结果然后往上层返回,得到最后合并结果。快速排序分治思路是先通过pivot - 当前数组中一个值作为标杆,将大于放到一边,小于放到一边,我们成为partition, 然后在分治到子问题,将左右两部分继续进行partition。当到达最小子问题时,数组已经是有序。原创 2022-01-31 12:17:04 · 370 阅读 · 0 评论 -
[亚麻高频题] Leetcode 907. Sum of Subarray Minimums(子数组最小值之和)
题目描述&链接Leetcode 907: 给定一个数组,找到所有子数组最小值,并返回所有最小值之和题目思路1. 暴力枚举直观思路就是通过暴力枚举出所有的子数组,并求所有子数组最小值之和,因为题目子数组是指连续子数组,所有暴力枚举就是枚举起始点和终止点,两层for loop。然后遍历的过程中打擂台保存当前最小值,并求和。直接上代码: public int sumSubarrayMins(int[] arr) { // 暴力求解起点终点 int r.原创 2022-01-30 08:04:58 · 970 阅读 · 0 评论 -
[亚麻高频题] Leetcode 140. Word Break II
题目描述&链接Leetcode 140:是Leetcode 139. Word Break进阶版,LC139求得是可行性,这道题求得是所有方案。相似题目Leetcode 139:Word BreakLeetcode 472: Concatenated Words题目思路1.DFS搜索既然要求所有方案就避免不了全局遍历,我们可以依照与LC139类似思路求解,从头遍历来寻找匹配的单词,然后从匹配单词后面的index继续搜索,或者跳过这次匹配就这向下找更长的匹配单词,直...原创 2022-01-09 13:29:47 · 286 阅读 · 0 评论