- 博客(83)
- 收藏
- 关注
原创 双向链表+哈希表实现O(1)
146. LRU 缓存请你设计并实现一个满足LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value)如果关键字key 已经存在,则变更其数据值value ;如果不存在,则向缓存中插入该组key-val...
2022-03-16 22:40:43 1101
原创 每日一题补题记录14
3.112049. 统计最高分的节点数目给你一棵根节点为 0 的 二叉树 ,它总共有 n 个节点,节点编号为 0 到 n - 1 。同时给你一个下标从 0 开始的整数数组 parents 表示这棵树,其中 parents[i] 是节点 i 的父节点。由于节点 0 是根,所以 parents[0] == -1 。一个子树的 大小 为这个子树内节点的数目。每个节点都有一个与之关联的 分数 。求出某个节点分数的方法是,将这个节点和与它相连的边全部 删除 ,剩余部分是若干个 非空 子树,这个节点的 分数
2022-03-15 20:49:31 949
原创 每日一题补题记录13
3.72055. 蜡烛之间的盘子给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0开始的字符串s,它只包含字符'*' 和'|',其中'*'表示一个 盘子,'|'表示一支蜡烛。同时给你一个下标从 0开始的二维整数数组queries,其中queries[i] = [lefti, righti]表示 子字符串s[lefti...righti](包含左右端点的字符)。对于每个查询,你需要找到 子字符串中在 两支蜡烛之间的盘子的 数目。如果一个盘子在 ...
2022-03-14 17:13:30 1546
原创 每日一题补题记录12
3.5521. 最长特殊序列 Ⅰ给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在,则返回 -1 。「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的子序列) 。字符串 s 的子序列是在从 s 中删除任意数量的字符后可以获得的字符串。例如,"abc" 是 "aebdc" 的子序列,因为删除 "aebdc" 中斜体加粗的字符可以得到 "abc" 。 "aebdc" 的子序列还包括 "aebdc" 、 "aeb" 和 ""
2022-03-11 22:30:11 349
原创 每日一题补题记录10
2.27553. 最优除法给定一组正整数,相邻的整数之间将会进行浮点除法操作。例如, [2,3,4] -> 2 / 3 / 4 。但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级。你需要找出怎么添加括号,才能得到最大的结果,并且返回相应的字符串格式的表达式。你的表达式不应该含有冗余的括号。示例:输入: [1000,100,10,2]输出: "1000/(100/10/2)"解释:1000/(100/10/2) = 1000/((100/10)/2) = 200但
2022-03-04 22:48:48 83
原创 每日一题补题记录8
2.20717. 1 比特与 2 比特字符有两种特殊字符:第一种字符可以用一比特0 表示第二种字符可以用两比特(10或11)表示给你一个以 0 结尾的二进制数组bits,如果最后一个字符必须是一个一比特字符,则返回 true 。简单遍历,遇见1走两步,遇见0走一步,如果能走到n-1,证明最后一个0一定是一比特字符class Solution { public boolean isOneBitCharacter(int[] bits) { int n...
2022-03-01 22:47:32 207
原创 每日一题补题记录9
2.23917. 仅仅反转字母给你一个字符串 s ,根据下述规则反转字符串:所有非英文字母保留在原有位置。 所有英文字母(小写或大写)位置反转。返回反转后的 s 。示例 1:输入:s = "ab-cd"输出:"dc-ba"示例 2:输入:s = "a-bC-dEf-ghIj"输出:"j-Ih-gfE-dCba"示例 3:输入:s = "Test1ng-Leet=code-Q!"输出:"Qedo1ct-eeLg=ntse-T!"很简单,左右两个指针逐渐向内扫描即可
2022-02-28 22:19:15 86
原创 每日一题补题记录7
2.14540. 有序数组中的单一元素给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。时间复杂度比较难实现,我可以随便写出两种On的1.哈希表class Solution { public int singleNonDuplicate(int[] nums) { HashMap<Integer,Inte
2022-02-16 20:49:10 287
原创 LeetCode第280周赛回顾
6004. 得到 0 的操作数给你两个 非负 整数 num1 和 num2 。每一步 操作中,如果 num1 >= num2 ,你必须用 num1 减 num2 ;否则,你必须用 num2 减 num1 。例如,num1 = 5 且 num2 = 4 ,应该用num1 减 num2 ,因此,得到 num1 = 1 和 num2 = 4 。然而,如果 num1 = 4且 num2 = 5 ,一步操作后,得到 num1 = 4 和 num2 = 1 。返回使 num1 = 0 或 num..
2022-02-15 23:22:03 7084
原创 LeetCode第278周赛回顾II
5994. 查找给定哈希值的子串给定整数 p和 m,一个长度为 k且下标从 0开始的字符串s的哈希值按照如下函数计算:hash(s, p, m) = (val(s[0]) * p0 + val(s[1]) * p1 + ... + val(s[k-1]) * pk-1) mod m.其中val(s[i])表示s[i]在字母表中的下标,从val('a') = 1 到val('z') = 26。给你一个字符串s和整数power,modulo,k和hashVal...
2022-02-13 21:46:21 395
原创 每日一题补题记录6
2.101447. 最简分数给你一个整数 n ,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n 的 最简 分数 。分数可以以 任意 顺序返回。这里要搞清楚最简分数的定义,也就是分子分母的最大公约数为1的分数,因为我们i/j递增,可以确保不会有重复分数,只需要满足最简即可,想要计算最大公约数,我们使用欧几里得算法gcd,也就是gcd(x,y)=gcd(y,x%y),如果xy可以整除返回较小数即可,我们始终保证大数在前。class Solution { p
2022-02-12 15:44:48 364
原创 每日一题补题记录5
2.71405. 最长快乐字符串如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:s 是一个尽可能长的快乐字符串。s 中 最多 有a 个字母 'a'、b个字母 'b'、c 个字母 'c' 。s 中只含有 'a'、'b' 、'c' 三种字母。如果不存在这样的字符串 s ,请返回一个空字符串 ""。方法:贪心,思路比较简单,.
2022-02-11 23:47:22 372
原创 每日一题补题记录4
2.41725. 可以形成最大正方形的矩形数目给你一个数组 rectangles ,其中 rectangles[i] = [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。如果存在 k 同时满足 k <= li 和 k <= wi ,就可以将第 i 个矩形切成边长为 k 的正方形。例如,矩形 [4,6] 可以切成边长最大为 4 的正方形。设 maxLen 为可以从矩形数组 rectangles 切分得到的 最大正方形 的边长。请你统计有多少个矩形能够切出边
2022-02-10 00:45:16 186
原创 每日一题补题记录3
1763. 最长的美好子字符串当一个字符串 s 包含的每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串。比方说,"abABB" 是美好字符串,因为 'A' 和 'a' 同时出现了,且 'B' 和 'b' 也同时出现了。然而,"abA" 不是美好字符串因为 'b' 出现了,而 'B' 没有出现。给你一个字符串 s ,请你返回 s 最长的 美好子字符串 。如果有多个答案,请你返回 最早 出现的一个。如果不存在美好子字符串,请你返回一个空字符串。方法一
2022-02-08 15:44:08 439
原创 LeetCode第278周赛回顾I
5993. 将找到的值乘以 2给你一个整数数组 nums ,另给你一个整数 original ,这是需要在 nums 中搜索的第一个数字。接下来,你需要按下述步骤操作:如果在 nums 中找到 original ,将 original乘以 2 ,得到新 original(即,令 original = 2 * original)。否则,停止这一过程。只要能在数组中找到新 original ,就对新 original 继续 重复 这一过程。返回 original 的 最终值。很简单,没什.
2022-01-30 23:37:29 6598
原创 Python数据结构1——数组
217. 存在重复元素给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。方法一:逐个将数组内容加入集合,如果已经有了,就证明有重复元素class Solution: def containsDuplicate(self, nums: List[int]) -> bool: numSet=set() for i in nums: if i in
2022-01-29 22:51:57 1414
原创 LeetCode1996. 游戏中弱角色的数量
1996. 游戏中弱角色的数量你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 。给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色 i 弱于 存在的另一个角色 j ,那么 attackj > attacki 且 defensej > defen
2022-01-28 23:53:04 2097
原创 每日一题补题记录2
2045. 到达目的地的第二短时间城市用一个 双向连通 图表示,图中有 n 个节点,从 1 到 n 编号(包含 1 和 n)。图中的边用一个二维整数数组 edges 表示,其中每个 edges[i] = [ui, vi]表示一条节点ui 和节点vi 之间的双向连通边。每组节点对由 最多一条 边连通,顶点不存在连接到自身的边。穿过任意一条边的时间是 time分钟。每个节点都有一个交通信号灯,每 change 分钟改变一次,从绿色变成红色,再由红色变成绿色,循环往复。所有信号灯都同时 改变。你...
2022-01-27 22:57:22 546
原创 每日一题补题记录1
1345. 跳跃游戏 IV给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。每一步,你可以从下标 i 跳到下标:i + 1满足:i + 1 < arr.lengthi - 1满足:i - 1 >= 0j满足:arr[i] == arr[j]且i != j请你返回到达数组最后一个元素的下标处所需的最少操作次数。注意:任何时候你都不能跳到数组外面。BFS,每一步都有三个跳法,注意每个值的等值跳只会跳一次,直接跳到最后一个等值位,然后不能再...
2022-01-26 23:47:58 611
原创 队列与栈复习IV-127. 单词接龙
127. 单词接龙字典wordList 中从单词 beginWord和 endWord 的 转换序列 是一个按下述规格形成的序列:序列中第一个单词是 beginWord 。序列中最后一个单词是 endWord 。每次转换只能改变一个字母。转换过程中的中间单词必须是字典wordList 中的单词。给你两个单词 beginWord和 endWord 和一个字典 wordList ,找到从beginWord 到endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列...
2022-01-25 17:29:30 403
原创 LeetCode2045. 到达目的地的第二短时间
2045. 到达目的地的第二短时间城市用一个 双向连通 图表示,图中有 n 个节点,从 1 到 n 编号(包含 1 和 n)。图中的边用一个二维整数数组 edges 表示,其中每个 edges[i] = [ui, vi] 表示一条节点 ui 和节点 vi 之间的双向连通边。每组节点对由 最多一条 边连通,顶点不存在连接到自身的边。穿过任意一条边的时间是 time 分钟。每个节点都有一个交通信号灯,每 change 分钟改变一次,从绿色变成红色,再由红色变成绿色,循环往复。所有信号灯都 同时 改变。你
2022-01-24 23:01:17 345
原创 队列与栈复习III
class Solution { public String decodeString(String s) { StringBuffer sb=new StringBuffer(); Stack<String>strStack=new Stack<>(); Stack<Integer>numStack=new Stack<>(); int num=0; for(ch...
2022-01-23 22:50:04 80
原创 队列与栈复习II——相互实现
225. 用队列实现栈请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。方法一:两个队列两个队列,入队都入q1,每次pop/peek除了最后一个都移入另一个队列,区别
2022-01-22 22:19:12 350
原创 LeetCode 1345. 跳跃游戏 IV
1345. 跳跃游戏 IV给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。每一步,你可以从下标 i 跳到下标:i + 1满足:i + 1 < arr.lengthi - 1满足:i - 1 >= 0j满足:arr[i] == arr[j]且i != j请你返回到达数组最后一个元素的下标处所需的最少操作次数。注意:任何时候你都不能跳到数组外面。求”最少次数“,很容易想到BFS方法,我们将每一步的三种选择,作为当前这一步的三个子节点,然...
2022-01-21 23:47:51 2480
原创 队列与栈复习I
133. 克隆图给你无向连通图中一个节点的引用,请你返回该图的深拷贝(克隆)。图中的每个节点都包含它的值val(int) 和其邻居的列表(list[Node])。class Node { public int val; public List<Node> neighbors;}深拷贝就是新建一个对象,和源对象的任何属性都相同,只是在内存中的地址不同,然后返回这个对象;浅拷贝就是用一个新指针指向源对象深拷贝也就是克隆,我们要新建对象,赋值,同时还...
2022-01-20 23:12:04 297
原创 LeetCode752. 打开转盘锁(BFS)
752. 打开转盘锁你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为'0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串 tar..
2022-01-19 23:51:52 188
原创 LeetCode539. 最小时间差
539. 最小时间差给定一个 24 小时制(小时:分钟"HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。首先剪枝:一天共计1440分钟,时间超过1440个一定就会有重复值,根据抽屉原理,返回0;方法一:哈希计数+寻找最小间距先将string转int,一天共有1440分钟,我们开辟一个大小为1440的数组记录每个分钟的出现次数,然后遍历这个数组,寻找最小间距class Solution { public int findMinDifference(..
2022-01-18 22:19:12 406
原创 LeetCodeDFS游戏-祖玛游戏&扫雷游戏
488. 祖玛游戏(回溯)你正在参与祖玛游戏的一个变种。在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'、黄色 'Y'、蓝色 'B'、绿色 'G' 或白色 'W' 。你的手中也有一些彩球。你的目标是 清空 桌面上所有的球。每一回合:从你手上的彩球中选出 任意一颗 ,然后将其插入桌面上那一排球中:两球之间或这一排球的任一端。接着,如果有出现 三个或者三个以上 且 颜色相同 的球相连的话,就把它们移除掉。如果这种移除操作同样导致出现三个或者三个以上且颜色相同的球相
2022-01-16 23:52:52 240
原创 LeetCode树复习II
236. ————叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”方法1——存储父节点:我的思路是从根节点开始遍历树,找到两个节点pq,并将他们的所有祖先(包括自己)自顶向下记录下来,然后比较祖先序列,从后到前,找到相同的则是最近公共祖先,但是很遗憾,这样TLE了,dfs用时并不多
2022-01-14 22:02:25 98
原创 LeetCode树复习I-构造二叉树
105. 从前序与中序遍历序列构造二叉树给定一棵树的前序遍历preorder与中序遍历inorder。请构造二叉树并返回其根节点。一开始一个笨比写法,没什么大问题,但是效率很低,在中序遍历中想找根节点,显然使用哈希表比较好,因为从头到尾我们都维护着初始数组不变,所以可以从头到尾使用同一个哈希表class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { int[]pre=...
2022-01-13 21:19:27 230
原创 LeetCode1036. 逃离大迷宫(BFS)
1036. 逃离大迷宫在一个 106 x 106 的网格中,每个网格上方格的坐标为 (x, y) 。现在从源方格 source = [sx, sy] 开始出发,意图赶往目标方格 target = [tx, ty] 。数组 blocked 是封锁的方格列表,其中每个 blocked[i] = [xi, yi] 表示坐标为 (xi, yi) 的方格是禁止通行的。每次移动,都可以走到网格中在四个方向上相邻的方格,只要该方格 不 在给出的封锁列表 blocked 上。同时,不允许走出网格。只有在可.
2022-01-12 17:55:57 356
原创 LeetCode 306. 累加数(回溯+剪枝)
306. 累加数累加数 是一个字符串,组成它的数字可以形成累加序列。一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。给你一个只包含数字'0'-'9'的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。说明:累加序列里的数,除数字 0 之外,不会 以 0 开头,所以不会出现1, 2, 03 或者1, 02, 3的情况。class Solution {...
2022-01-11 22:39:50 215
原创 LeetCode回溯专题-N皇后问题I&II
51. N 皇后n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。方法还是比较明确的,官方题解有位运算方法,这个可以简化,但是我觉得用hashset就可以了。首先逐行处理,每行中找一个位置填入皇后,每个位置都要考虑是否会和其他皇后冲突,每个皇后的势力范围包括所在行、列、斜行,.
2022-01-10 18:15:27 251
原创 LeetCode回溯专题-37. 解数独
37. 解数独编写一个程序,通过填充空格来解决数独问题。数独的解法需 遵循如下规则:数字1-9在每一行只能出现一次。数字1-9在每一列只能出现一次。数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用'.'表示。方法一:暴力搜索,三个used数组储存每行每列每个九宫格的数字使用状态,然后再根据used数组来回溯class Solution { public void solveSudoku(...
2022-01-09 21:42:58 280
原创 LeetCode回溯专题-60. 排列序列&93. 复原 IP 地址
60. 排列序列给出集合[1,2,3,...,n],其所有元素共有n! 种排列。按大小顺序列出所有排列情况,并一一标记,当n = 3 时, 所有排列如下:"123""132""213""231""312""321"给定n 和k,返回第k个排列。方法一 找出全排列,按序排列,再根据下标找到所求值,参考class Solution { int cnt=0; public String getPermutation(int n, int ...
2022-01-08 22:25:15 1164
原创 LeetCode 1614. 括号的最大嵌套深度
1614. 括号的最大嵌套深度如果字符串满足以下条件之一,则可以称之为 有效括号字符串(valid parentheses string,可以简写为 VPS):字符串是一个空字符串 "",或者是一个不为 "(" 或 ")" 的单字符。字符串可以写为 AB(A 与 B字符串连接),其中 A 和 B 都是 有效括号字符串 。字符串可以写为 (A),其中 A 是一个 有效括号字符串 。类似地,可以定义任何有效括号字符串S 的 嵌套深度 depth(S):depth("") = 0dept...
2022-01-07 11:14:08 209
原创 LeetCode 71. 简化路径(模拟+UNIX文件系统复习)
71. 简化路径给你一个字符串 path ,表示指向某一文件或目录的Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..)表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。请注意,返回的 规范路径 必须遵循下述格式:始...
2022-01-06 22:51:20 100
原创 LeetCode 1576. 替换所有的问号
1576. 替换所有的问号理论上是26个小写字母,但只要前后不同,3个即可class Solution { public String modifyString(String s) { char[]array=s.toCharArray(); for(int i=0;i<array.length;i++){ if(array[i]=='?'){ for (char ch = 'x'; ch &
2022-01-05 23:44:52 243
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人