![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
文章平均质量分 64
南波兔不写巴哥
这个作者很懒,什么都没留下…
展开
-
22年4月刷题总结
伴随着互联网裁员的压力和入职时间的临近,又开始刷每日一题啦本次只记录每题的要点,不关注具体实现时间为倒序4-18 Lc386 字典序排数对1−n1-n1−n进行字典序排序思路是通过dfs来生成,模拟字典序逻辑为:dfs(num): 如果(num<=n),添加 dfs(num*10) 如果num+1不产生进位,dfs(num+1)核心在于+1不能产生进位,否则会与*10的结果重复4-17 Lc819 最常见的单词核心在于,如何对一段英文进行分词String[]原创 2022-04-18 10:29:19 · 211 阅读 · 0 评论 -
21年11月第四周 力扣每日一题记录
本周每日一题 题目lc 384. 打乱数组11-22 lc 384. 打乱数组这题我把它想得复杂了,以为reset是返回到上一个状态,所以还记录下了如何洗牌,所以多了一个swapRec的数组,还多了reset中被注释的方法,这个请忽略直接保存一个最初的数组即可,注意java的语言特点,所以这里得用深拷贝,可以用system.copyofarray,也可以用clone方法,前者要好一些其实,省gc的时间洗牌的逻辑是,遍历数组,使得当前位置与前面的随机一个位置交换这里的概率如何证明洗牌的结果公原创 2021-11-22 15:06:49 · 508 阅读 · 0 评论 -
21年11月第三周 力扣每日一题记录
本周每日一题 题目lc 319. 灯泡开关11-15 lc 319. 灯泡开关这一题很有意思,是个数学题具体的思路我写在注释上了class Solution { //是一个数学题 //4号位的灯,会被1点亮,2点灭,4点灭,所以4号位的灯,实际上因子有1,2,4 所以它是亮着的 //那么对于i位置的灯,其实我们不需要知道它有多少个因子,而只需要知道它有偶数个因子还是奇数个就可以了 //这里的因子包含1和自身 //实际上,因子都是成对出现的,如果i是原创 2021-11-15 16:15:16 · 3670 阅读 · 0 评论 -
21年11月第二周 力扣每日一题记录
本周每日一题 题目lc 299. 猜数字游戏11-08 lc299. 猜数字游戏两遍循环解决,第一遍是将相同的bull记录下来,同时记下secret有多少个不一样的数字情况,第二遍是将不同的cow计算出来这里因为出现的样本有限,所以用数组代替map,速度加快同时,StringBuilder#append的速度大幅领先与String的+经过优化,最终达到100%时间,70%的空间class Solution { //就是把对应位置的直接bull,非对应位置的记在map中,就是co原创 2021-11-08 10:50:01 · 6854 阅读 · 0 评论 -
21年11月第一周 力扣每日一题记录
本周每日一题 题目lc575. 分糖果11-01 lc575. 分糖果数组的长度就是糖果的数量然后数量是平均分配的题目是希望妹妹能够获得更多种类的糖果(数量一定)那么对于妹妹来说,尽量是一个种类获得一种 。那么统计种类数x,如果大于n/2,那么就是n/2,否则就是xclass Solution { public int distributeCandies(int[] candyType) { //统计种类数 Set<Integer>原创 2021-11-01 09:17:37 · 135 阅读 · 0 评论 -
21年10月第五周 力扣每日一题记录
本周每日一题 题目lc301. 删除无效的括号10-27 lc301. 删除无效的括号因为要所有可能的结果,所以要穷举所有的结果用bfs,每次删除一个括号,每个位置都有可能删除class Solution { //用bfs的思路, 每次删除一个括号, 这里不删除非括号字符哦 //用set来维护当前结果, 使得不重复 //如果一旦出现有符合的, 则当前轮次结束, 将结果输出 public List<String> removeInvalidPare原创 2021-10-27 09:14:40 · 3518 阅读 · 0 评论 -
21年10月第四周 力扣每日一题记录
本周每日一题 题目lc476. 数字的补数10-18 lc476. 数字的补数对示例做这样一个事,求num+答案+1,结果刚好是2^n,然后再用几个测试用例,发现也是这样,所以这就是本题的规律然后这个2^n是大于num的最小的n,所以答案如下class Solution { public int findComplement(int num) { long n = 1; while(n<=num) n = n << 1;原创 2021-10-18 09:27:03 · 137 阅读 · 0 评论 -
21年10月第三周 力扣每日一题记录
本周每日一题 题目lc273. 整数转换英文表示10-11 lc273. 整数转换英文表示这题真是把我恶心到了,没有给数字与单词的映射表,我真是服了,自己敲半天,而且我单词敲错了好几个,真是书白读了不过还算是好题,我的思路是先解决十亿和百万的级别,逻辑为,用 iii 标识当前位,用 exceedexceedexceed 来标识超出当前档次的数位,比如当前是9位,就是超过了7位的百万2位然后百万以下的单独算,也是一样的逻辑,先来弄千,再来百,然后每次都是先处理超过的部分,再加上当前的档次,然后原创 2021-10-11 10:21:32 · 207 阅读 · 0 评论 -
21年10月第二周 力扣每日一题记录
本周每日一题 题目lc482. 密钥格式化lc284. 窥探迭代器10-04 lc482. 密钥格式化今天是个简单题,也是非常简单的一道题给一个字符串,经过处理然后给k值,将字符串分成多个k字符的分组,第一个小于等于k,那么很简单,第一个直接是n%k就可以了,后面的全部是k,当然,如果结果是0,那么每个都是k,第一个就置为k简单题,直接看代码,不多bbclass Solution { //按照-来分割字符串,然后第一个分组小于等于k,至少有一个,后面的要刚好包含k个字符原创 2021-10-05 10:06:00 · 173 阅读 · 0 评论 -
21年10月第一周 力扣每日一题记录
本周每日一题 题目lc482. 密钥格式化10-04 lc482. 密钥格式化今天是个简单题,也是非常简单的一道题给一个字符串,经过处理然后给k值,将字符串分成多个k字符的分组,第一个小于等于k,那么很简单,第一个直接是n%k就可以了,后面的全部是k,当然,如果结果是0,那么每个都是k,第一个就置为k简单题,直接看代码,不多bbclass Solution { //按照-来分割字符串,然后第一个分组小于等于k,至少有一个,后面的要刚好包含k个字符 //然后因为只有字母原创 2021-10-04 08:55:30 · 185 阅读 · 0 评论 -
21年9月第五周 力扣每日一题记录
题目lc639. 解码方法 II09-27 lc639. 解码方法 II一道hard题,难点在于思考的全面性,容易漏case我做了挺长时间,因为我把 1e9+71e9+71e9+7写成了10e9+710e9+710e9+7,真的服了,大哭,我是伞兵首先这是个dp问题,dp的比较简单按位读,每次进行判断如果是*,则本身能够表示9个数字,然后再看前面的字符是否有如果前面的字符是1 or 2,那么就多一种可能如果前面的字符是*,则就是连续两个*,原创 2021-09-27 10:44:31 · 141 阅读 · 0 评论 -
21年9月第四周 力扣每日一题记录
题目725.分隔链表09-22 725.分隔链表第一天开始每日一题,做个记录吧,也是让自己坚持下去题意为按照k来将链表分成k份,任意两份长度不超过1那么很显然,最长的区间长度,len/k + 1, 个数一共有len%k个 最短的len/k代码如下,基本是优解好久没写java了,手挺生的,敲挺慢的哈哈哈class Solution { //首先需要知道长度 //平均长度 len/k,则有len % k个是len/k +1的其余都是len/k //然后进行分割原创 2021-09-22 16:29:53 · 109 阅读 · 0 评论 -
leetcod82 删除排序链表中的重复元素II 迭代+递归解法
题目详情迭代解法 public ListNode deleteDuplicates(ListNode head) { if(head==null||head.next==null) return head; ListNode newHead = new ListNode(-101); newHead.next = head; ListNode pre = newHead; ListNode cur = head;原创 2021-07-15 10:05:49 · 125 阅读 · 0 评论 -
leetcode 45跳跃游戏II
题目详情本题与跳楼梯很像, 但是跳的最大台阶数是不确定的暴力解dp暴力解O(n2) + O(n)public int jump(int[] nums) { if(nums==null||nums.length<2) return 0; int n = nums.length; int[] f = new int [n]; f[0] = 0; for(int i=1; i<n; i++){原创 2021-07-08 20:19:29 · 105 阅读 · 1 评论 -
剑指43- 整数中1出现的个数 找规律解法
题目详情这里牛客网上的叙述及其的敷衍,还是力扣上的详细很多,输入的是正整数,因为n可以很大,所以要考虑时间复杂度,不能O(N)哦。原创 2021-02-16 13:28:51 · 161 阅读 · 0 评论 -
Leetcode-123 买卖股票3 dp详细题解
题目详情给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [3,3,5,0,0,3,1,4]输出: 6解释: 在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 =原创 2021-01-01 20:37:43 · 369 阅读 · 0 评论 -
Leetcode-265 粉刷房子2 题解
题目详情假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x k 的矩阵来表示的。例如,costs[0][0] 表示第 0 号房子粉刷成 0 号颜色的成本花费;costs[1][2] 表示第 1 号房子粉刷成 2 号颜色的成本花费,以此类推。请你计算出粉刷完所有房子最少的花费成本。所有花费均为正整数。原创 2021-01-01 15:42:54 · 852 阅读 · 0 评论 -
LeetCode-581 最短无序连续子数组 O(n)+O(1)
题目详情给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。你找到的子数组应是最短的,请输出它的长度。示例 1:输入: [2, 6, 4, 8, 10, 9, 15]输出: 5解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。解题思路很简单,代码很清晰class Solution { //解题的思路是这样,首先应该O(n)能够解决这个问题 //两个指针,只需要记录错误的开头和原创 2020-12-15 16:34:15 · 120 阅读 · 0 评论 -
LeetCode234-判断回文链表 O(n)时间O(1)空间 几乎双百解法
题目详情请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true要求: O(n) 时间复杂度和 O(1) 空间复杂度解决此题解题结合回文序列的特点,进行如下想法三步:快慢指针寻中点(考虑奇偶分别进行处理)前半段reverse两段链表进行挨个比较缺陷(对原数据进行了修改,最终没有改回去) 具体的思路我在代码中写的十分清楚了此处就是将三步进行综合,这三步其实拆开都可以作为单独的一道原创 2020-12-06 19:25:05 · 131 阅读 · 0 评论 -
环形链表的快慢指针相遇的数学证明
我们说的环形链表是类似于下图的环形链表慢指针一圈内必遇上设我们的环长度为CCC。假定我们慢指针的初始位置是环的入口(比如上图的2),设这个位置为0.而快指针的初始位置是AAA,A∈[0,C−1]A \in [0,C-1]A∈[0,C−1]。假设慢指针走了K步之后,快慢指针相遇,则慢指针位置:0+K0+K0+K,而快指针的位置是A+2KA+2KA+2K.此时,显然有一个道理,快指针的初始距离加上它的走过的距离超了慢指针走的距离的nCnCnC.所以可以得到表达式(A+2K)−(0+K)=nC(A+原创 2020-12-02 09:24:30 · 864 阅读 · 1 评论 -
LeetCode-128 找出数字连续的最长序列 原创O(n)解法
题目详情给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。你可以设计并实现时间复杂度为 O(n) 的解决方案吗?题目分析该题难点在于O(n),所以不能用排序这里很明显,暴力解法是O(n2),那么就需要空间换时间。于是我便想到利用map。其中是<Integer,Integer>,然后代表的是区间.例如,区间[3,5],hashmap中如此存放:(3:5),(5,3),左边界对应右边界,右边界对应左边界。然后每加入一个新的元素,判断原创 2020-12-01 15:27:15 · 741 阅读 · 0 评论 -
LeetCode-42 接雨水多解 清晰思路
题目详情给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9三种解法第一种解法是我自己的想法,一开始比较暴力的方法,和栈其实有点像。是分原创 2020-11-24 16:03:51 · 171 阅读 · 0 评论 -
LeetCode 34 查找元素第一个与最后一个 题解
题目详情给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]写这题的目的,是为了锻炼自己的二分能力,二分还是要多写啊,毕竟l原创 2020-11-23 16:54:53 · 141 阅读 · 0 评论 -
LeetCode 31 下一个更大字典序排列 97%解法 清晰思路演变分析
题目详情实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]示例 2:输入:nums = [3,2,1]输出:[1,2,3]示例 3:输入:nums = [1,1,5]输出:[1,5,1]示例 4:输入:nums = [1]输出:[1]之所以想写这题,是因为,这题很原创 2020-11-19 19:25:11 · 308 阅读 · 0 评论 -
Leetcode 3-无重复字符的最长子串 暴力解法转变到快速解法的详解
题目详情给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。暴力解原创 2020-11-15 18:05:05 · 586 阅读 · 0 评论 -
LeetCode做题随记
自我随记做题时遇到一些语法问题queue中offer与add区别Queue 中 add() 和 offer()都是用来向队列添加一个元素。在容量已满的情况下,add() 方法会抛出IllegalStateException异常,offer() 方法只会返回 false 。...原创 2020-10-29 20:02:33 · 190 阅读 · 0 评论 -
LeetCode BST专题 538 把二叉搜索树转换成累加树 java
题目详情给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。解题思路及代码本题是BST,关于BST我们要明确一点,中序遍历是输出从小到大的有序数列。然后我们这里每个点的新值是当前值+所有大于当前值的值,若我们有一个有序数列,则该点的新值为:从旧值开始,一直累加到尾。当然,我们不存在先中序遍历一遍,然后再访问数组,再去遍历一遍修改,这样太麻烦了。我们直接从有序数列原创 2020-10-30 21:24:46 · 124 阅读 · 0 评论 -
二叉树(& BST)的前序、中序、后序遍历(递归与迭代),java BST的构建
关于前序中序后序遍历比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC(先左后根最后右);后序顺序是BCA(先左后右最后根)。皆是根节点(当前节点)访问的位置来命名,都是用dfs来实现。前序:中左右中序:左中右后序:左右中java代码实现-递归前序:void dfs(TreeNode root) { visit(root); dfs(root.left); dfs(root.right)原创 2020-10-29 21:06:33 · 1118 阅读 · 0 评论 -
LeetCode 链表专题 19 删除倒数第n个数 java 递归解法&&多指针解法
题目详情本题是删除链表的倒数第n个数,因为链表的性质,所以必须得遍历才知道链表有多长。为了知道每个节点是倒数第几个节点,我们这里用回溯来计数,从而统计自己是第几个数。另外我们删除第n个数的逻辑是,用第n+1个数去指向n-1个数(倒数)。不过这存在一个特殊情况。n-1的数必然存在,它可以为空,但n+1的数可能不存在,当我们要删除的数就在链表的头部时,n+1这个元素为空,我们可以用一个节点指向空,但绝不能用空节点指向另外一个节点。所以我们需要去判断第n个元素是否是头节点,如果是,那么我们就返回头结点的原创 2020-10-20 15:29:37 · 291 阅读 · 0 评论 -
LeetCode 回溯专题 46 全排列 题解
题目详情给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]该题是一到比较简单而且经典的回溯题,或者说是排列组合穷举题,这种题只要回溯(dfs+删除操作)即可完成,写本文的目的在于,一是记录下回溯的一般写法,二是提醒自己关于java中的引用一定要注意。题目分析对于回溯问题的一般思路就是:def backtrack(路径,选择列表):原创 2020-10-15 09:45:23 · 169 阅读 · 0 评论 -
LeetCode 二分查找专题 153 旋转数组最小值 题解
题目详情假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1示例 2:输入: [4,5,6,7,0,1,2]输出: 0题目分析关于二分查找,我们首先要确定的是查询操作是否适合2分查找,即每次选择中间的数之后,是否能从当前数和左右边界的数来判断目标数在前还是后,即是否从中间的数能找到规律。原创 2020-09-28 16:08:55 · 145 阅读 · 0 评论 -
LeetCode 贪心专题 665 非递减数列 题解
题目详情给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]示例 1:输入: nums = [4,2,3]输出: true解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。关于该题,写这题的原因在于,这题让我回忆起高中的关于非严格递增的定义,觉得很好玩。题目分析这一题我原创 2020-09-24 16:31:12 · 309 阅读 · 0 评论 -
LeetCode 贪心专题 763 划分字母区间 题解
题目详情关于这一题,要写的原因也是贪心的十分明显,而且其中区间更新的概念感觉十分好玩,所以就写这题了。首先是题目:字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。示例 1:输入:S = “ababcbacadefegdehijhklij”输出:[9,7,8]解释:划分结果为 “ababcbaca”, “defegde”, “hijhklij”。每个字母最多出现在一个片段中。像 “ababcbac原创 2020-09-22 15:31:23 · 152 阅读 · 0 评论 -
LeetCode 贪心专题 53 最大子序和 题解
写在前面之前我都是针对专题来写刷题博客的,这样一次要写10多题,而且有些题其实并不是很想写,思路很舒服的题写了埋在里面也没人看,所以现在就打算改变策略,把特别好的题单独拿出来写,这样便于检索,也减轻自己的负担。同时也能针对单个题,写的更清晰题目详情这一题为啥要写呢,我是觉得本题的贪心思想很好,同时它的题目要求输出很简单,是最大值,而不是说要求具体范围,只要求最大值时很多时候我们只需要一个数去记录它就ok,而不用关心那么多,整体的思路就很清晰。所以这道题我记录它的目的在于,有些问题,明明很简单,不需要原创 2020-09-22 11:14:41 · 124 阅读 · 0 评论 -
LeetCode 贪心专题 java代码 思路 题解
不断更新中题解455 分发饼干问题题目详情:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。题目分析:该题是一个很经典的,也很简单的贪心问题,可以很舒服的引入贪心的思想。我们的目标是满足尽可原创 2020-09-12 17:29:56 · 211 阅读 · 0 评论 -
LeetCode 双指针专题 java代码 思路 题解
前言:正式开始刷题啦从今儿开始,会进入全新的刷题阶段,争取保持每天都刷题的状态,除此之外,会争取做一个完整的运用spring的项目,同时保证实验室的工作能正常做完。加油。双指针专题的结题思路是使用两个指针来顺序遍历数组,从而实现目的,或同向,或反向,或块或慢,不同的使用方法会达到不同的效果。同时,对于不同的问题,可以采用递归或者其他方法,总体来说,双指针用起来还是十分之快的。当然,其劣势也明显,在解决一些问题时,双指针需要考虑数组越界的问题,这个比较麻烦,也是要放到第一位考虑的。关于数组越界问题,可以原创 2020-08-31 11:45:04 · 250 阅读 · 0 评论