![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Leetcode
Leetcode实战题解
锥栗
这个作者很懒,什么都没留下…
展开
-
【Leetcode】ACM模式的各种输入处理
前言以牛客笔试题为例,ACM模式下的输入处理示例ZJ1 附加题 (多行多个int)ZJ1 附加题题目地址第一行一个int数字,第二行有多个int数字,那我们第一个存一个数字,第二行用ArrayList存起来。import java.util.Scanner;import java.util.List;import java.util.ArrayList;public class Main { public static List<Integer> list = ne原创 2021-09-21 21:22:37 · 4883 阅读 · 0 评论 -
【Leetcode】总集篇
题目索引我的索引结构是:数据结构1:|____ 任务目标 - 题目1|____ 任务目标 - 题目2|____ …|____ 特殊算法:|____ |____ 任务目标 - 题目n|____ |____ 任务目标 - 题目n+1|____ |____ …数据结构2:|____ 任务目标 - 题目1|____ 任务目标 - 题目2|____ …|____ 特殊算法:|____ |____ 任务目标 - 题目n|____ |____ 任务目标 - 题目n+1|_原创 2021-05-26 16:37:44 · 632 阅读 · 0 评论 -
【Leetcode】442. 数组中重复的数据
题目描述给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?题解执行用时:7 ms, 在所有 Java 提交中击败了30.79%的用户内存消耗:47.3 MB, 在所有 Java 提交中击败了56.24%的用户通过测试用例:28 / 28import java.util.*;/** * 本题nums数组的数字范围,在 [1, nums.l原创 2021-11-22 20:09:17 · 91 阅读 · 0 评论 -
【Leetcode】443. 压缩字符串
题目描述给你一个字符数组 chars ,请使用下述算法压缩:从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :如果这一组长度为 1 ,则将字符追加到 s 中。否则,需要向 s 追加字符,后跟这一组的长度。压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。请在 修改完输入数组后 ,返回该数组的新长度。你必须设计并实现一个只使用常量额外空间的算法来解决此问原创 2021-11-20 10:07:10 · 127 阅读 · 0 评论 -
【Leetcode】678. 有效的括号字符串
题目描述给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:任何左括号 ( 必须有相应的右括号 )。任何右括号 ) 必须有相应的左括号 ( 。左括号 ( 必须在对应的右括号之前 )。可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。一个空字符串也被视为有效字符串。题解贪心算法根据左括号能够匹配的数量,维护一个数字区间[ 左括号能匹配的最小数量leftMatchMin , 左括号能够匹配的最大数量left原创 2021-11-18 20:36:56 · 647 阅读 · 0 评论 -
【Leetcode】86. 分隔链表
题目描述给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。题解非常简单粗暴又有效,让small用于链接小结点,large用于链接大结点,最后两个结点链接起来。执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:37.6 MB, 在所有 Java 提交中击败了86.29%的用户通过测试用例:168 / 168import java原创 2021-11-17 20:34:54 · 538 阅读 · 0 评论 -
【Leetcode】445. 两数相加 II
题目描述给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。题解坑:这题只能逐位计算,不能把链表整个直接转为一个整体 int 来计算,因为给的测试用例会溢出,求和会导致溢出。逐位计算的话,我们希望的是从低位到高位遍历,求和之后的进位可以记录下来,用于下一位遍历的求和。但是题目链表给的是从高位到低位的顺序,所以我们必须先想办法,让我们能从低位到高位遍历。我的做法是原创 2021-11-15 19:45:19 · 839 阅读 · 0 评论 -
【Leetcode】125. 验证回文串
题目描述题解思路很好想,先去除非字母的字符,然后所有字母大写变小写,然后判断是不是回文字符。但是测试用例居然把数字字符算进要考虑的范围了,太坑了。所以最后还需要加判断是否是数字,是字符或者数字都可以加进要判断的字符串中。执行用时:4 ms, 在所有 Java 提交中击败了46.12%的用户内存消耗:38.5 MB, 在所有 Java 提交中击败了56.90%的用户通过测试用例:480 / 480class Solution { public boolean isPalindrome(S原创 2021-11-14 20:30:49 · 409 阅读 · 0 评论 -
【Leetcode】295. 数据流的中位数
题目描述中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。题解用大顶堆和小顶堆分别存储一般数据,大顶堆存较小一半数据,小顶堆存储较大一半数据。如 maxHeap [3 2 1], m原创 2021-11-07 17:10:41 · 84 阅读 · 0 评论 -
【Leetcode】1047. 删除字符串中的所有相邻重复项
题目描述给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一题解队列辅助法:利用队列 d 作为一个缓存,逐个读取字符并存入缓存中,存入缓存之前需要进行判断,如果发现连读取两个重复字符,在缓存中删除。最后将缓存转化为String输出。执行用时:21 ms, 在所有 Java 提交中击败了49.74%的用户内存消耗:38.7 MB, 在所有 Java 提原创 2021-11-07 16:32:30 · 142 阅读 · 0 评论 -
【Leetcode】74. 搜索二维矩阵
题目描述题解暴力解法执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:38.1 MB, 在所有 Java 提交中击败了7.76%的用户通过测试用例:133 / 13class Solution { public boolean searchMatrix(int[][] matrix, int target) { for (int[] ints : matrix) { for (int i : ints) {原创 2021-11-05 16:50:13 · 71 阅读 · 0 评论 -
【Leetcode】189. 旋转数组
题目描述给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?题解翻转数组法翻转数组其实就是头尾指针互换元素,然后头尾指针向中间遍历,如此循环。我们需要旋转数组,其实只需要做三次旋转即可。执行用时0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:55.3 MB, 在所有 Java 提交中击败了38.26%的用户通过测原创 2021-11-04 11:03:52 · 3287 阅读 · 0 评论 -
【Leetcode】135. 分发糖果
题目描述老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?题解左遍历+右遍历执行用时:3 ms, 在所有 Java 提交中击败了46.47%的用户内存消耗:40.2 MB, 在所有 Java 提交中击败了5.03%的用户通过测试用例:48 / 48class Sol原创 2021-11-02 16:16:36 · 4008 阅读 · 0 评论 -
【Leetcode】40. 组合总和 II
题目描述给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。注意:解集不能包含重复的组合。题解我们可以看这道题的前身【Leetcode】39. 组合总和,candidates中的元素是可以重复使用的,但是在这里不行。共同点是,组合本身不能重复。不重复取元素对象在回溯搜索里,可以通过安排for循环的起点来实现。但是如果candidates本身存在重复数原创 2021-10-30 10:08:33 · 4295 阅读 · 0 评论 -
【笔试题】素数天购买设备
题目描述题解自己尝试解了一下,不知道对不对import java.util.*;public class Main { public static Map<Integer,Integer> map = new TreeMap<Integer,Integer>(); public static List<Integer> primeList = new ArrayList<>(); public static int res原创 2021-10-10 20:54:19 · 100 阅读 · 0 评论 -
【Leetcode】107. 二叉树的层序遍历 II
题目描述题解很简单,分层的层序遍历,并且插入List<List<\Integer>>的时候按照倒叙插入即可(循环插入到list的头部)。执行用时:1 ms, 在所有 Java 提交中击败了95.71%的用户内存消耗:38.8 MB, 在所有 Java 提交中击败了16.68%的用户通过测试用例:34 / 34/** * Definition for a binary tree node. * public class TreeNode { * int va原创 2021-10-06 10:46:39 · 71 阅读 · 0 评论 -
【Leetcode】1302. 层数最深叶子节点的和
题目描述题解层序遍历是一定要的(而且是分层的层序遍历),也就是在层序遍历的过程中把 结点.val 加起来,但是要的是最后一层,我想不到要怎么判断遍历层最后一层,所以直接把每一层的 结点.val 加起来得到sum,到下一层的时候清空sum。执行用时:6 ms, 在所有 Java 提交中击败了16.10%的用户内存消耗:39.8 MB, 在所有 Java 提交中击败了49.66%的用户通过测试用例:35 / 35/** * Definition for a binary tree node.原创 2021-10-06 10:16:14 · 176 阅读 · 0 评论 -
【Leetcode】257. 二叉树的所有路径
题目描述题解能用String解决的最好不要走StringBuilder。递归时注意空结点(null)回退和叶子结点判定回退。执行用时:9 ms, 在所有 Java 提交中击败了30.66%的用户内存消耗:39.1 MB, 在所有 Java 提交中击败了5.11%的用户通过测试用例:208 / 208/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNo原创 2021-10-05 11:19:14 · 85 阅读 · 0 评论 -
【Leetcode】111. 二叉树的最小深度
题目描述题解递归遍历,记录深度,然后贪心地去更新结果(取min())。考虑到这里还不够,需要加一层叶节点的判断,必须当前节点是叶子结点才能够做res的更新。否则可能会碰到这种情况:根结点左边没有子树,根结点右边有子树,结果递归下去发现深度是1(只考虑了左边没子树的情况,没有考虑到此时并不是叶子结点,而是根结点)执行用时:6 ms, 在所有 Java 提交中击败了57.73%的用户内存消耗:58.9 MB, 在所有 Java 提交中击败了22.96%的用户通过测试用例:52 / 52/**原创 2021-10-04 10:58:18 · 59 阅读 · 0 评论 -
【Leetcode】572. 另一棵树的子树
题目描述题解本题和【剑指offer】26. 树的子结构很像,但是注意在空值判定上要更严格。执行用时:3 ms, 在所有 Java 提交中击败了86.35%的用户内存消耗:38.5 MB, 在所有 Java 提交中击败了74.28%的用户通过测试用例:182 / 182/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * T原创 2021-10-04 10:24:37 · 81 阅读 · 0 评论 -
【Leetcode】863. 二叉树中所有距离为 K 的结点
题目描述题解用map记录每个结点的父结点,然后让dfs从target结点开始(假设target就是根结点),然后递归时纪录深度,只要深度等于k,就是和target的距离等于k,就可以存入list。执行用时:14 ms, 在所有 Java 提交中击败了74.54%的用户内存消耗:38.1 MB, 在所有 Java 提交中击败了98.78%的用户class Solution{ List<Integer> res = new ArrayList<>(); Map原创 2021-10-03 21:12:03 · 111 阅读 · 0 评论 -
【Leetcode】560. 和为K的子数组
题目描述题解暴力解法,双循环,i指针从左往右走,j指针从i往左走,一个个遍历一个个加起来,直到加到等于k,就计数一次。执行用时:1445 ms, 在所有 Java 提交中击败了21.59%的用户内存消耗:41.5 MB, 在所有 Java 提交中击败了27.77%的用户class Solution { public int subarraySum(int[] nums, int k) { int count = 0; for (int i = 0; i &l原创 2021-09-29 14:32:38 · 59 阅读 · 0 评论 -
【Leetcode】43. 字符串相乘
题目描述题解从低位往高位乘,进位累加到下一个高位,这个点肯定都能想到。问题在于如何存这样的状态。其实很简单,num1假设有n位,num2假设有m位,那么num1和num2的运算结果分解到n + m位来处理就行了。我们先取num1的低位,然后遍历num2从低到高每一位,与num1的低位相乘,得到的结果按照对应的位,存入n+m的列表中(有进位就处理进位),相当于数字按位分解相乘。比如123 * 456 = 123 * (6 + 50 + 400),我们有:1)6 * 123 = 7382)50 *原创 2021-09-26 10:31:38 · 66 阅读 · 0 评论 -
【Leetcode】662. 二叉树最大宽度
题目描述题解还记得二叉树层序遍历https://blog.csdn.net/fisherish/article/details/115791079,还有二叉堆的概念,结点如果为 i,那么左子节点值为 i *2,右子节点值为 i * 2 + 1。结合一下本题就能做出来了。在【Leetcode】440. 字典序的第K小数字中,我们确定一层的节点数量,可以用最右节点值减去最左节点值(排好序的情况下)。因此我们可以自己造数据,每一层的节点都从0开始数,赋值为0,每一层的第二个节点赋值为1,以此类推。让最右结原创 2021-09-20 22:47:48 · 82 阅读 · 1 评论 -
【Leetcode】440. 字典序的第K小数字
题目描述题解建议直接看大佬讲解https://www.bilibili.com/video/BV1q5411A7fU?spm_id_from=333.999.0.0执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:35.1 MB, 在所有 Java 提交中击败了74.90%的用户核心模式class Solution { public int findKthNumber(int n, int k) { long cur = 1;原创 2021-09-19 19:48:02 · 80 阅读 · 0 评论 -
【Leetcode】145. 二叉树的后序遍历
题目描述给定一个二叉树,返回它的 后序 遍历。题解递归法执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:36.8 MB, 在所有 Java 提交中击败了29.78%的用户/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode()原创 2021-09-13 13:37:55 · 65 阅读 · 0 评论 -
【Leetcode】16. 最接近的三数之和
题目描述给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。题解解法和【Leetcode】15. 三数之和很像的,只是我们不再需要看等于0的条件了,而是尽可能地接近目标数target,并且依据和target的差值,来更新最接近的和。class Solution { public int threeSumClosest(int[] nums, int targ原创 2021-09-12 17:03:33 · 56 阅读 · 0 评论 -
【Leetcode】329. 矩阵中的最长递增路径
题目描述给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。题解回溯搜索,其实是可以这样的:但是时间复杂度会超。class Solution { int[][] direction = {{0,1}, {0,-1}, {1,0}, {-1,0}}; int[][] matrix; int res = 0; int r原创 2021-09-05 20:53:50 · 139 阅读 · 0 评论 -
【Leetcode】14. 最长公共前缀
题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。题解执行用时:1 ms, 在所有 Java 提交中击败了75.80%的用户内存消耗:36.4 MB, 在所有 Java 提交中击败了81.01%的用户// 纵向扫描法class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0)原创 2021-09-05 09:45:13 · 70 阅读 · 0 评论 -
【Leetcode】154. 寻找旋转排序数组中的最小值 II
题目描述已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个可能存在 重复 元素值的原创 2021-09-02 18:54:42 · 72 阅读 · 0 评论 -
【Leetcode】153. 寻找旋转排序数组中的最小值
题目描述已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个元素值 互不相同 的数组原创 2021-09-02 16:56:46 · 79 阅读 · 0 评论 -
【Leetcode】225. 用队列实现栈
题目描述请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、si原创 2021-09-02 13:00:06 · 60 阅读 · 0 评论 -
【Leetcode】59. 螺旋矩阵 II
题目描述给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。题解这道题不能说和【Leetcode】54. 螺旋矩阵非常相似,只能说是一模一样。执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:36.3 MB, 在所有 Java 提交中击败了82.70%的用户class Solution { int[][] res; int count = 1; pub原创 2021-08-31 22:17:37 · 71 阅读 · 0 评论 -
【Leetcode】61. 旋转链表
题目描述给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。题解旋转链表 = 找倒数第k个节点 + 翻转前后链表执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:37.8 MB, 在所有 Java 提交中击败了62.16%的用户/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next原创 2021-08-30 13:01:36 · 90 阅读 · 0 评论 -
【Leetcode】739. 每日温度
题目描述请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。题解执行用时:42 ms, 在所有 Java 提交中击败了33.34%的用户内存消耗:47.7 MB, 在所有 Java 提交中击败了69.26%的用户// ↓// [55,38,53,81,61,93,97,32,43,78] len = 9// [9]// 0 0 0 0原创 2021-08-29 16:59:40 · 84 阅读 · 0 评论 -
【Leetcode】230. 二叉搜索树中第K小的元素
题目描述给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。题解大顶堆法(前序)遍历树的所有元素,设定一个大顶堆maxHeap,如果堆的size没达到k,就一直往里存元素,如果size达到了k,则凡是小于堆顶元素才能被存入maxHeap。执行用时:1 ms, 在所有 Java 提交中击败了43.60%的用户内存消耗:38.2 MB, 在所有 Java 提交中击败了59.98%的用户/** * Definition for原创 2021-08-24 22:46:01 · 85 阅读 · 0 评论 -
【Leetcode】179. 最大数
题目描述给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。题解题眼在于,本题需要转为String字符串处理,然后通过重写排序方法,达到我们的目的。执行用时:4 ms, 在所有 Java 提交中击败了92.46%的用户内存消耗:37.8 MB, 在所有 Java 提交中击败了65.98%的用户class Solution { public String largestNumber(in原创 2021-08-24 13:13:34 · 71 阅读 · 0 评论 -
【Leetcode】44. 二叉树的前序遍历
题目描述题解递归法执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:36.7 MB 在所有 Java 提交中击败了38.60%的用户/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(i原创 2021-08-23 13:08:23 · 98 阅读 · 0 评论 -
【Leetcode】24. 两两交换链表中的节点
题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。题解三指针法,至少三指针才能实现交换。始终取需要交换节点的上一个pre,下一个cur,和两个交换节点靠左的那个节点(mid,left),因此交换完,mid会被换到右边,我们还要修正mid的位置。执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:36.1 MB, 在所有 Java 提交中击败了43.47%的用户/** * Defini原创 2021-08-23 11:54:08 · 75 阅读 · 0 评论 -
【Leetcode】151. 翻转字符串里的单词
题目描述给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。题解本题应该是和【剑指offer】58. 翻转单词顺序一模一样的。执行用时:8 ms, 在所有 Java 提交中击败了50.95%的用户内存消耗:39原创 2021-08-22 22:44:35 · 368 阅读 · 0 评论