leetcode
小星有大理想
这个作者很懒,什么都没留下…
展开
-
接雨水同类题(LeetCode 821)
821. 字符的最短距离给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数.示例 1:输入:s = “loveleetcode”, c = “e”输出:[3,2,1,0,1,0,0,1,2,2,1,0]解释:字符 ‘原创 2022-04-19 10:03:21 · 178 阅读 · 0 评论 -
Integer.parseInt(s)与Integer.valueOf(s)的区别
1、Integer.parseInt(s)多次解析同一个字符串得到的int基本类型数据是相等的,可以直接通过“==”进行判断是否相等。Integer.valueOf(s)多次解析相同的一个字符串时,得到的是Integer类型的对象:如果s字符串对应的整数值在 -128 ~ 127之间,则解析出的Integer类型的对象是同一个对象;如果s字符串对应的整数值不在-128~127之间,则解析出的Integer类型的对象不是同一个对象。不管对象是否相等,对象中的value值是相等的。给你一个正整数 num 。你原创 2022-04-10 14:57:24 · 349 阅读 · 0 评论 -
Integer类型使用踩坑
最小覆盖子串给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = “ADOBECODEBANC”, t = “ABC”输出:“BANC”class Solution { public String minWindow(Strin原创 2022-04-09 10:51:04 · 327 阅读 · 0 评论 -
前缀和学习(LeetCode 661)
图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像 。示例 1:输原创 2022-03-24 11:30:52 · 122 阅读 · 0 评论 -
字典树学习(LeetCode 720)
给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。示例 1:输入:words = [“w”,“wo”,“wor”,“worl”, “world”]输出:“world”解释: 单词"world"可由"w", “wo”, “wor”, 和 "worl"逐步添加一个字母组成。示例 2:输入:words = [“a”, “ban原创 2022-03-17 09:15:40 · 192 阅读 · 0 评论 -
模拟题(LeetCode 393)
给定一个表示数据的整数数组 data ,返回它是否为有效的 UTF-8 编码。UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则:对于 1 字节 的字符,字节的第一位设为 0 ,后面 7 位为这个符号的 unicode 码。对于 n 字节 的字符 (n > 1),第一个字节的前 n 位都设为1,第 n+1 位设为 0 ,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。这是 UTF-8 编码的工作方式:Char. number ra原创 2022-03-14 08:45:58 · 71 阅读 · 0 评论 -
归并排序模板
//归并函数void Merge(int[ A,int low, int mid, int high){ int i = low,j = mid + 1, k; //三个指针,i j是B上的,K是A上的 int[] B = new int[A.length]; //把A复制到B for(k=low;k<=high;k++) B[k]=A[k]; //比较i j的key值,把小的放入A[k] for(k=i;i<=mid&&j<=high;k++){ i原创 2022-03-07 09:33:54 · 65 阅读 · 0 评论 -
快排学习(LeetCode 215题)
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4提示:1 <= k <= nums.length <= 104-104 <= nums[i] <= 104class Solution { publi原创 2022-03-06 11:15:52 · 331 阅读 · 0 评论 -
广搜学习(LeetCode 838)
n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:dominoes[i原创 2022-02-22 08:54:59 · 332 阅读 · 0 评论 -
二分学习(LeetCode 540)
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。示例 1:输入: nums = [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: nums = [3,3,7,7,10,11,11]输出: 10思路分析:成对出现的元素第一个对应的下标总是偶数,第二个对应的下标总是奇数。进行二分搜索的时候,如果当前下标为偶数,则进行nums[i]==原创 2022-02-14 12:19:15 · 268 阅读 · 0 评论 -
模拟哈希表学习(leetcode 539)
539. 最小时间差给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。示例 1:输入:timePoints = ["23:59","00:00"]输出:1示例 2:输入:timePoints = ["00:00","23:59","00:00"]输出:0 提示:2 <= timePoints <= 2 * 104timePoints[i] 格式为 "HH:MM"思路:使用数组模拟哈希表,一天总共1440分原创 2022-01-18 09:46:50 · 167 阅读 · 0 评论 -
多路归并排序学习(leetcode 373)
373. 查找和最小的 K 对数字给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。示例 1:输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3输出: [1,2],[1,4],[1,6]解释: 返回序列中的前 3 对数: [1,2],[1,原创 2022-01-17 09:25:47 · 365 阅读 · 0 评论 -
字符串哈希(leetcode 1044)
最长重复字串给你一个字符串 s ,考虑其所有 重复子串 :即,s 的连续子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。返回 任意一个 具有最长长度的重复子串。如果 s 不含重复子串,那么答案为 “” 。示例 1:输入:s = "banana"输出:"ana"示例 2:输入:s = "abcd"输出:"" 提示:2 <= s.length <= 3 * 104s 由小写英文字母组成我们使用一个与字符串 等长的哈希数组 h[],以及次方数组 p[]。由字原创 2022-01-17 09:09:14 · 323 阅读 · 0 评论 -
回溯练习(leetcode306累加数)
累加数 是一个字符串,组成它的数字可以形成累加序列。一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。给你一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。说明:累加序列里的数,除数字 0 之外,不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。示例 1:输入:"112358"输出:true 解释:累加序列为:原创 2022-01-15 09:49:26 · 141 阅读 · 0 评论 -
格雷码生成
n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1)第一个整数是 0,一个整数在序列中出现 不超过一次,每对 相邻 整数的二进制表示 恰好一位不同 ,且第一个 和 最后一个 整数的二进制表示 恰好一位不同给你一个整数 n ,返回任一有效的 n 位格雷码序列 。示例 1:输入:n = 2输出:[0,1,3,2]解释:[0,1,3,2] 的二进制表示是 [00,01,11,10] 。00 和 01 有一位不同01 和原创 2022-01-09 09:24:58 · 209 阅读 · 0 评论 -
二分学习(只出现一次的数字)
给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。示例 1:输入: nums = [1,1,2,3,3,4,4,8,8]思路:本地的做法很多,这里考虑三种。二分查找:因为数组是有序数组,将数组中的数字每两个分为一组,先找出位于中间的一组,确定这一组的两个数组是否相同。如果这两个数字相同,那么只出现一次的数字一定在它的后面,此时查找它后半部分。如果不同,则检查这一组是不是第一组两个数字不相同的分组。如果是第1组,那么这一组的第1个数字就是只出现原创 2021-12-19 19:34:26 · 343 阅读 · 0 评论 -
前缀树应用二
设计一个使用单词列表进行初始化的数据结构,单词列表中的单词 互不相同 。 如果给出一个单词,请判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于已构建的神奇字典中。实现 MagicDictionary 类:MagicDictionary() 初始化对象。void buildDict(String[] dictionary) 使用字符串数组 dictionary 设定该数据结构,dictionary 中的字符串互不相同。bool search(String searchWord) 给定一个原创 2021-12-18 20:25:42 · 72 阅读 · 0 评论 -
前缀树的应用
在英语中,有一个叫做 词根(root) 的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。现在,给定一个由许多词根组成的词典和一个句子,需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。需要输出替换之后的句子。示例 1:输入:dictionary = [“cat”,“bat”,“rat”], sentence = “the原创 2021-12-18 19:48:59 · 134 阅读 · 0 评论 -
前缀树学习
Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word .boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWith(Strin原创 2021-12-18 09:59:10 · 67 阅读 · 0 评论 -
前缀树学习
替换单词在英语中,有一个叫做 词根(root) 的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。现在,给定一个由许多词根组成的词典和一个句子,需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。需要输出替换之后的句子。示例 1:输入:dictionary = [“cat”,“bat”,“rat”], sentence =原创 2021-12-15 19:56:04 · 1374 阅读 · 0 评论 -
动态规划学习
三个无重叠子数组的最大和(leetcode 689)给你一个整数数组 nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且 3 * k 项的和最大的子数组,并返回这三个子数组。以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。示例 1:输入:nums = [1,2,1,2,6,7,5,1], k = 2输出:[0,3,5]解释:子数组 [1, 2], [2, 6], [7, 5] 对应的起始下标为 [0, 3,原创 2021-12-09 08:46:43 · 57 阅读 · 0 评论 -
二叉树的左、右视图
二叉树的右视图(剑指Offer II 046)给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入: [1,2,3,null,5,null,4]输出: [1,3,4]思路:右视图即为二叉树每层最后一个节点class Solution { public List<Integer> rightSideView(TreeNode root) { List<Integer> result = n原创 2021-12-06 09:59:11 · 1668 阅读 · 0 评论 -
数组模拟哈希表
数组模拟哈希表原创 2021-12-04 08:06:31 · 187 阅读 · 0 评论 -
动态规划学习(打家劫舍三)
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1]3/ 2 3\ \3 1输出: 7解释: 小偷一晚能够盗取的原创 2021-09-24 10:50:39 · 83 阅读 · 0 评论 -
动态规划学习(打家劫舍二)
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻原创 2021-09-24 09:33:38 · 61 阅读 · 0 评论 -
动态规划学习(打家劫舍一)
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。备忘录解法:每次进行判断,当前可以选择偷原创 2021-09-24 08:56:39 · 72 阅读 · 0 评论 -
双指针学习(leetcode345)
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例 1:输入:"hello"输出:"holle"示例 2:输入:"leetcode"输出:"leotcede"思路:将所有元音字母存入Set集合,声明左指针left,右指针right,从左到右和从右到左同时找元音字母,找到进行交换即可。class Solution { Set<Character> vowels = new HashSet<>(){{ add('a');原创 2021-08-19 08:04:30 · 96 阅读 · 0 评论 -
动态规划算法学习(leetcode174题)
解法一:记忆化递归如果想要求最小初始值,需要不断的递归从后面往前推。因为这样才能从最后的状态推导出一开始骑士最少需要多少血 int [][]memory; public int calculateMinimumHP(int[][] dungeon) { int m = dungeon.length; int n = dungeon[0].length; memory = new int[m][n]; for(int []row :原创 2021-08-15 09:44:21 · 199 阅读 · 0 评论 -
区间问题(leetcode56合并区间)
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入:intervals = [[1,4],[4,5]]原创 2021-07-18 09:03:44 · 62 阅读 · 0 评论 -
二分搜索练习(leetcode1011)
传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。示例 1:输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5输出:15解释:船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示:第 1 天:1, 2, 3, 4, 5第 2 天:6, 7原创 2021-07-09 08:22:33 · 68 阅读 · 0 评论 -
模幂运算(超级次方leetcode372)
你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。示例 1:输入:a = 2, b = [3]输出:8示例 2:输入:a = 2, b = [1,0]输出:1024方法一: int mod = 1337; int index = 1; public int superPow(int a, int[] b) { int len = b.length; if(len == 0)原创 2021-07-05 09:19:28 · 281 阅读 · 0 评论 -
递归和迭代学习(leetcode341扁平化嵌套列表迭代器)
给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。示例 1:输入: [[1,1],2,[1,1]]输出: [1,1,2,1,1]解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]方法一:递归(N叉树遍历思想)public class NestedIterator implements Iterato原创 2021-07-03 09:47:07 · 80 阅读 · 0 评论 -
前缀和学习(leetcode560)
定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。解法一: public int subarraySum(int[] nums, int k) { int len = nums.le原创 2021-07-02 08:48:09 · 91 阅读 · 0 评论 -
煎饼排序学习(递归)
给你一个整数数组 arr ,请使用 煎饼翻转 完成对数组的排序。一次煎饼翻转的执行过程如下:选择一个整数 k ,1 <= k <= arr.length。反转子数组 arr[0…k-1](下标从 0 开始)。例如,arr = [3,2,1,4] ,选择 k = 3 进行一次煎饼翻转,反转子数组 [3,2,1] ,得到 arr = [1,2,3,4] 。以数组形式返回能使 arr 有序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * arr.length 范围内的有效答案都原创 2021-07-01 09:07:19 · 177 阅读 · 0 评论 -
三数之和总结
public List<List<Integer>> threeSum(int[] nums) { return threeSumTarget(nums,0); } public List<List<Integer>> threeSumTarget(int []nums,int target){ Arrays.sort(nums); int len = nums.length; L原创 2021-06-29 09:14:01 · 62 阅读 · 0 评论 -
leetcode单调栈题目
leetcode496题给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。 public int[] nextGreaterElement(int[] nums1, int[] nums2) { Map<Integer,I原创 2021-06-10 09:21:21 · 49 阅读 · 0 评论 -
leetcode第244场周赛第二题(5777使数组元素相等的减少操作次数)
给你一个整数数组 nums ,你的目标是令 nums 中的所有元素相等。完成一次减少操作需要遵照下面的几个步骤:找出 nums 中的 最大 值。记这个值为 largest 并取其下标 i (下标从 0 开始计数)。如果有多个元素都是最大值,则取最小的 i 。找出 nums 中的 下一个最大 值,这个值 严格小于largest ,记为 nextLargest 。将 nums[i] 减少到 nextLargest 。返回使 nums 中的所有元素相等的操作次数。虽然题目要求最大值一次只能修改一个,但是分析问题原创 2021-06-06 14:47:00 · 144 阅读 · 0 评论 -
回溯算法学习(五)
解决回溯问题,需要考虑三个问题:1、路径:已经做出的选择。2、选择列表:你可以做出的选择。3、结束条件。模板如下: List<类型> result = new ArrayList<>(); dfs(选择){ if 满足结束条件 result.add(路径) for(选择列表做选择){ 做选择 dfs(往下遍历) 撤销选择 } }leetcode52题 //正斜线i - j Set<Integer> positive =原创 2021-06-02 10:10:20 · 54 阅读 · 0 评论 -
回溯算法学习(四)
解决回溯问题,需要考虑三个问题:1、路径:已经做出的选择。2、选择列表:你可以做出的选择。3、结束条件。模板如下: List<类型> result = new ArrayList<>(); dfs(选择){ if 满足结束条件 result.add(路径) for(选择列表做选择){ 做选择 dfs(往下遍历) 撤销选择 } }leetcode51题N皇后问题List<List<String>> result原创 2021-06-02 09:48:24 · 41 阅读 · 0 评论 -
回溯算法学习(三)
解决回溯问题,需要考虑三个问题:1、路径:已经做出的选择。2、选择列表:你可以做出的选择。3、结束条件。模板如下: List<类型> result = new ArrayList<>(); dfs(选择){ if 满足结束条件 result.add(路径) for(选择列表做选择){ 做选择 dfs(往下遍历) 撤销选择 } }leetcode4...原创 2021-06-02 09:16:59 · 70 阅读 · 0 评论