
LeetCode
文章平均质量分 58
不爱研究的研究僧
这个作者很懒,什么都没留下…
展开
-
739. 每日温度
题目:力扣给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。题解:遍历整个数组,如果栈不空,且当前数字大于栈顶元素,那么如果直接入栈的话就不是 递减栈 ,所以需要取出栈顶元素,由于当前数字大于栈顶元素的数字,而且一定是第一个大于栈顶元素的数,直接求出下标差就是二者的距离。继续看新的栈顶元素,直到当前数字小于等于栈顶元素停止,原创 2022-05-04 14:51:15 · 119 阅读 · 0 评论 -
621. 任务调度器
题目:力扣给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要计算完成所有任务所需要的 最短时间 。题解:maxTimes 的两行第一个元素之间.原创 2022-04-29 15:36:49 · 284 阅读 · 0 评论 -
581. 最短无序连续子数组
题目:力扣给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。题解:首先,我们希望这个数组是单调递增的。从左往右,一开始max是第一个数。如果数组符合要求,那么遍历的每一个数都只会相等或者越来越大,也就是我们只会不停地更新max的值。但是,一旦碰到一个小于max的数,就说明这个数字的位置不对,这个数字一定是在我们最终要重新sort的subarray里的,并且是右边原创 2022-04-28 16:05:25 · 177 阅读 · 0 评论 -
560. 和为 K 的子数组
题目:力扣给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。题解:1.暴力法枚举所有组合 ,符合情况的count加1class Solution { public int subarraySum(int[] nums, int k) { int count = 0; for (int left = 0; left < nums.length; left++) { i...原创 2022-04-28 15:04:31 · 108 阅读 · 0 评论 -
543. 二叉树的直径
题目:力扣给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。题解:穿过根节点的直径长度 = 左子树的最大深度 + 右子树的最大深度 + 1,不穿过根节点的直径长度有可能大于穿过的,因此取两者最大值,每一次记录下。最大深度是左子树和右子树中的最大深度 + 1,利用递归计算,在递归过程中记录最大的直径长度。/** * Definition for a binary tree node. * publ原创 2022-04-27 11:21:43 · 813 阅读 · 0 评论 -
461. 汉明距离
题目:力扣两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。题解:1.利用函数Integer.bitCount():计算二进制表达中1的数量的函数class Solution { public int hammingDistance(int x, int y) { return Integer.bitCount(x ^ y); }}2.移位实现位计数...原创 2022-04-27 09:26:04 · 261 阅读 · 0 评论 -
448. 找到所有数组中消失的数字
题目:力扣给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。题解:1.最简单的方法是使用哈希表,没有包含的就是结果值,HashSet就可以解决set.add(i)) :如果存在i,添加失败,返回false,不存在,返回trueclass Solution { public List<Integer> findDisapp.原创 2022-04-26 16:29:56 · 231 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词
题目:力扣给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。题解:...原创 2022-04-26 15:43:15 · 164 阅读 · 0 评论 -
437. 路径总和 III
题目:力扣给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。题解:一个朴素的做法是搜索以每个节点为根的(往下的)所有路径,并对路径总和为 targetSumtargetSum 的路径进行累加统计。dfs1函数:使用 dfs1 来搜索所有节点,先用dfs2搜素root开始的路径,再用dfs1分别搜素原创 2022-04-26 09:38:29 · 618 阅读 · 0 评论 -
394. 字符串解码
题目:力扣给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。题解:当c为数字时:计算倍数multi 当c为字母时...原创 2022-04-25 11:29:24 · 462 阅读 · 0 评论 -
338. 比特位计数
题目:力扣给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。题解:理解题目的意思:比如n = 5,0-5的数转为二进制,6个数字的二进制中1的个数分别对应结果数组6个位置的值思路:对于所有的数字,只有两类:奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。 举例: 0 = 0 ...原创 2022-04-25 09:26:03 · 1518 阅读 · 0 评论 -
287. 寻找重复数
题目:力扣给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。题解:使用环形链表II的方法解题(142.环形链表II)步骤:数组通过映射关系转为链表,出现多对一的关系就会出现环。1.找到环中的相遇位置2.找到环入口:从头的...原创 2022-04-24 17:06:06 · 277 阅读 · 0 评论 -
283. 移动零
题目:力扣给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。题解:使用双指针的思路,第一次写的时候代码冗长class Solution { public void moveZeroes(int[] nums) { int p1 = 0, p2 = 1; while (p2 < nums.length) { if原创 2022-04-24 16:26:30 · 95 阅读 · 0 评论 -
240. 搜索二维矩阵 II
题目:力扣编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。题解:有序找某个数想到二分法,这里有多行,因此每行进行二分法,通过target精确到某几行。某一行的第一个元素大于了target,当前行和后边的所有行都不用考虑了,直接返回false 某一行的最后一个元素小于了target,当前行就不用考虑了,换下一行class Solution {...原创 2022-04-24 15:22:08 · 225 阅读 · 0 评论 -
238. 除自身以外数组的乘积
题目:力扣给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请不要使用除法,且在 O(n) 时间复杂度内完成此题。题解:乘积 = 当前数左边的乘积 * 当前数右边的乘积原数组: [1 2 3 4]左部分的乘积: 1 1原创 2022-04-24 10:54:29 · 164 阅读 · 0 评论 -
【链表】234. 回文链表
题目:力扣给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。题解:我们可以将链表的后半部分反转(修改链表结构),然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。整个流程可以分为以下五个步骤:1.找到前半部分链表的尾节点。我们也可以使用快慢指针在一次遍历中找到:慢指针一次走一步,快指针一次走两步,快慢指针同时出发。当快指针移动到链表的末尾时,慢指针恰好到链表的中间。通过慢指针将链表分为两部分原创 2022-04-24 10:25:17 · 283 阅读 · 0 评论 -
【动态规划】221. 最大正方形
题目:在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。题解:dp 具体定义:dp[i + 1][j + 1] 表示 「以第 i 行、第 j 列为右下角的正方形的最大边长」为何不是 dp[i][j]任何一个正方形,我们都「依赖」当前格 左、上、左上三个方格的情况,但第一行的上层已经没有格子,第一列左边已经没有格子,需要做特殊 if 判断来处理,为了代码简洁,我们 假设补充 了多一行全 '0'、多一列全 '0'此...原创 2022-04-23 11:16:29 · 250 阅读 · 0 评论 -
【快排】215. 数组中的第K个最大元素
题目:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。题解:快排每轮partition就可以将选中的pivot放到其最终有序位置,当某轮pivot被放到第k大元素位置(从小到大有序序列的下标n-k处)时,确定该pivot为结果pivot的选择利用随机数可以防止最差时间复杂度。nextInt()用法:会随机生成一个整数,这个整数的范围就是int类型的范围-2^31 ~ 2^3原创 2022-04-23 10:29:55 · 234 阅读 · 0 评论 -
208. 实现 Trie (前缀树)
题目:力扣Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean s原创 2022-04-22 16:44:32 · 103 阅读 · 0 评论 -
【图】207. 课程表
题目:力扣你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对[0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。.原创 2022-04-22 11:26:07 · 116 阅读 · 0 评论 -
200. 岛屿数量
题目:给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。题解:力扣将岛屿问题讲的很清楚。class Solution { public int numIslands(char[][] grid) { int res = 0; for (int i = 0; i < gr..原创 2022-04-22 09:42:41 · 100 阅读 · 0 评论 -
169. 多数元素
题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 题解:利用哈希表统计每个数字的个数 找出value即个数最多的那个entry,因为比较的是value,但返回的是key,因此要用的结果是entry注意:set是contains(),map是containsKey();map中获取某个key的value用的是get();entry获取key用的是...原创 2022-04-21 17:02:40 · 433 阅读 · 0 评论 -
【栈】155. 最小栈
题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin() 获取堆栈中的最小元素。题解:使用两个栈,stack继承于vector,效率低,因此用LinkedList实现deque。当一个元素要入栈时,我们取当前原创 2022-04-21 16:18:00 · 163 阅读 · 0 评论 -
【动态规划】152. 乘积最大子数组
题目:给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。子数组 是数组的连续子序列。题解:设置阶段最大值和阶段最小值的意义在于正数遇到下一个负数会变成负数,而负数遇到下一个正数会变成正数,在遍历数组的过程中如果遇到nums[i] < 0,就要交换阶段最大值和阶段最小值,每次都要更新阶段最大值和阶段最小值。class Solution { publi.原创 2022-04-21 15:25:16 · 469 阅读 · 0 评论 -
【链表】148. 排序链表
题目:给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。题解:时间复杂度是O(nlogn) 的排序算法包括归并排序、堆排序和快速排序(快速排序的最差时间复杂度是 O(n^2),其中最适合链表的排序算法是归并排序。这里用递归的方式进行归并排序。步骤:1.找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2步,慢指针每次移动 1 步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。2..原创 2022-04-21 11:27:15 · 432 阅读 · 0 评论 -
146. LRU 缓存
题目:力扣请你设计并实现一个满足LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value)如果关键字key 已经存在,则变更其数据值value ;如果不存在,则向缓存中插入该组key-va...原创 2022-04-20 11:02:17 · 165 阅读 · 0 评论 -
【链表】141. 环形链表
题目:给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true 。 否则,返回 false 。题解:使用快慢指针,如果有环,快指针可以追上慢指针,如果没环,快指针会走到null的位置/**.原创 2022-04-20 09:31:22 · 281 阅读 · 0 评论 -
136. 只出现一次的数字
题目:力扣给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4题解:res = res ^ num 相当于 res = nums[0] ^ nums[1] ^ ...nums[n - 1],则相同的数为0了,最后剩单独的那一个数字class Sol...原创 2022-04-19 10:45:03 · 207 阅读 · 0 评论 -
128. 最长连续序列
题目:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例 1:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。示例 2:输入:nums = [0,3,7,2,5,8,4,6,0,1]输出:9题解:在一个未排序的整数数组 nums中 ,找出最长的数字连续序列,朴素的做法是:枚举nu原创 2022-04-19 10:22:33 · 177 阅读 · 0 评论 -
114. 二叉树展开为链表
题目:给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。题解:思路:如果左子树不为空,做以下操作,如果为空,符合题目要求,只需要接着循环 1 / \ 2 5/ \ \3 4 6//将 1 的左子树插入到右子树的地方 1 \ 2 ...原创 2022-04-19 09:44:05 · 249 阅读 · 0 评论 -
79. 单词搜索
题目:力扣给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。题解:递归函数设计:u代表当前枚举到了目标单词word第u个位置。x,y是当前搜索到的二维字符网格的横纵坐标。1.终止情况当前字符和word第u个字符不..原创 2022-04-18 10:43:31 · 144 阅读 · 0 评论 -
75. 颜色分类
题目:力扣给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库的sort函数的情况下解决这个问题。示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]示例 2:输入:nums = [2,0,1]输出:[0,1,2]提示:n == nums.length1 <.原创 2022-04-18 09:14:03 · 116 阅读 · 0 评论 -
【动态规划】64. 最小路径和
题目:力扣给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例 1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例 2:输入:grid = [[1,2,3],[4,5,6]]输出:12提示:m == grid.lengthn == grid[i].length1 <.原创 2022-04-17 17:09:22 · 672 阅读 · 0 评论 -
49. 字母异位词分组
题目:力扣给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。示例 1:输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]示例 2:输入: strs = [""]输出: [[""]]示例 3:输入: st原创 2022-04-17 11:23:51 · 263 阅读 · 0 评论 -
48. 旋转图像
题目:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。题解:旋转矩阵的问题其实就是沿着竖中轴线、横中轴线、斜对角线的翻转。顺时针旋转90:先沿对角线反转矩阵,再沿竖中轴线反转矩阵; 顺时针旋转180:先沿横中轴线反转矩阵,再沿竖中轴线反转矩阵; 顺时针旋转270:先沿对角线反转矩阵,再沿横中轴线反转矩阵;class Soluti.原创 2022-04-17 10:26:14 · 233 阅读 · 0 评论 -
【二分法】34. 在排序数组中查找元素的第一个和最后一个位置
题目:力扣给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回[-1, -1]。进阶:你可以设计并实现时间复杂度为O(log n)的算法解决此问题吗?示例 1:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]示例2:输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]示例 3...原创 2022-04-17 09:41:52 · 268 阅读 · 0 评论 -
【二分法】33. 搜索旋转排序数组
题目:力扣整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为[4,5,6,7,0,1,2] 。给你 旋转后 的数.原创 2022-04-16 10:01:09 · 163 阅读 · 0 评论 -
31. 下一个排列
题目:力扣整数数组的一个 排列就是将其所有成员以序列或线性顺序排列。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。..原创 2022-04-15 16:58:13 · 99 阅读 · 0 评论 -
【回溯】22. 括号生成
题目:力扣数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8题解:首先我们需要知道一个结论,一个合法的括号序列需要满足两个条件:1、左右括号数量相等2、任意前缀中左括号数量 >= 右括号数量 (也就.原创 2022-04-15 15:47:55 · 145 阅读 · 0 评论 -
【链表】21. 合并两个有序链表
题目:力扣将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递.原创 2022-04-15 14:58:21 · 1073 阅读 · 0 评论