自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 资源 (1)
  • 收藏
  • 关注

原创 【LeetCode - Java】50. Pow(x, n)(中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 快速幂 先求指数二进制3.2 快速幂 同时求指数二进制3.3 对比1. 题目描述2. 解题思路上一次看见这种类型的题目还是在上一次…例如这个【LeetCode - Java】69. Sqrt(x) (简单),或者更离谱的这个【LeetCode - Java】29. 两数相除(中等)| 地狱难度。于是乎在这里我先尝试了使用牛顿迭代法去逼近,发现这道题若使用牛顿迭代法的目标答案只能转化为 log(ans)log(ans)log(ans) ,显然答案就

2022-03-10 11:38:15 605

原创 【LeetCode - Java】49. 字母异位词分组(中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 哈希表计数统计3.2 哈希表外观数列统计3.3 哈希表排序统计3.4 对比1. 题目描述2. 解题思路这道题目的重点在于如何判断字母异位词,这时候我首先就想起了之前做过的一道题目【LeetCode - Java】46. 全排列(中等),在全排列中所有的组合都是相互的字母异位词,那么这样说我是不是可以把字符串数组中的值读取出来,生成他们所有的全排列,判断其是否在数组中从而得出答案呢?按道理来说这样做是肯定没有问题的,但求全排列是一个时间复杂度非常高

2022-03-09 14:39:03 690

原创 【LeetCode - Java】48. 旋转图像(中等)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路假如可以新建矩阵,那么这道题就简单很多了,但只能原地旋转,我们就需要找出旋转前的元素坐标与旋转后元素坐标的对应规律了,画个图会更好理解,图中00,01等都是代表坐标:对于上图矩阵,首先大体思路是一圈一圈进行旋转,在每一圈中对length-1个元素进行选择,length为正方形的边长,那么旋转元素之间的对应关系就应该是这样子,同颜色的对应同颜色的:具体的实际旋转过程为:那么第一层(所有着色部分)的旋转过程如下图所示:

2022-03-09 10:16:10 605

原创 【LeetCode - Java】46. 全排列(中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 模拟插入法3.2 DFS回溯3.3 对比1. 题目描述2. 解题思路对于此类排列组合的问题,我们其实是可以找到一定规律的,下面来观察一下:数组是 [1],结果是 [[1]]数组是 [1,2],结果是 [[1,2],[2,1]]数组是 [1,2,3],结果是 [[1,2,3],[1,3,2],[3,1,2],[2,1,3],[2,3,1],[3,1,2]]有没有发现什么规律?数组 [1,2] 比数组 [1] 多了一个2,那么答案就是在

2022-03-08 17:35:29 731

原创 【LeetCode - Java】38. 外观数列(中等)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路既然这是使用递归定义的字符串,那么自然而然我们也使用递归来解决,当然也可以使用迭代实现,有意思的是官方居然整了个“打表”的方法,妥妥地面向测试用例编程了,真的是老奶奶钻被窝,给爷整笑了!3. 代码实现public String countAndSay(int n) { if (n == 1) return "1"; char[] chars = countAndSa

2022-03-08 11:40:06 306

原创 【LeetCode - Java】36. 有效的数独(中等)| 只需一次遍历

目录1. 题目描述2. 解题思路3. 代码实现3.1 哈希表3.2 数组3.3 对比1. 题目描述2. 解题思路题意所示,有效的数独需要满足三个条件:行中无重复、列中无重复和3X3中无重复,因此我们可以用一个哈希表记录元素是否出现过,针对三种不同的情况分别遍历一次数独就可以得出答案了,一共遍历三次,但是这样做比较浪费时间,可以遍历两次就得出答案吗?观察一下发现,其实行的重复判断与列的重复判断可以在一次遍历中同时实现的,只需要把二维数组的下标互换就可以了,这样就需要两个哈希表用于记录元素是否出现过

2022-03-08 11:00:15 582

原创 【LeetCode - Java】34. 在排序数组中查找元素的第一个和最后一个位置(中等)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路仍然是经典的搜索类题目,仍然是使用经典的二分法,但二分法只能查找到一个符合条件的值,如该题意所示需要找到两个值,因此需要执行两次二分法进行查找,一次查找开始位置,一次查找结束位置。其实两次查找算法的大部分逻辑代码都是一样的,按道理来说可以抽取成一个方法以减少重复代码的编写,但由于小部分逻辑判断与当前查找的状态(找开始还是找结束)有关,因此如果抽取函数需要再传入一个状态值进行辅助判断,这里为了代码的可读性,就不进行抽取了。3.

2022-03-08 09:22:04 282

原创 【LeetCode - Java】33. 搜索旋转排序数组(中等)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路对于搜索类的题目最常用的是二分法,但该题目的重点在于如何判断下一个搜索区域是哪一部分,对于普通有序数组而言边界条件是很好判断的,但对于此类型经过旋转的局部有序数组则需要我们分情况讨论:当前值就是目标值:直接返回下标当前值比目标值小:当前值及其左半部分是有序的或右半部分最大值大于等于目标值:搜索右边(如数组[4,5,6,7,0,1],目标值7;数组[4,5,1,2,3],目标值2)当前值及其左半部分是

2022-03-07 15:19:24 388

原创 【LeetCode - Java】29. 两数相除(中等)| 地狱难度

目录1. 题目描述2. 解题思路3. 代码实现3.1 暴力累加(卒 | 时间超限)3.2 循环乘二法(位运算)3.3 ~~对比~~ 吐槽1. 题目描述2. 解题思路对于常规运算而言,乘法与除法其实是一体的,运算也是可以互换的(除以a与乘1/a等同)。那么乘法的本质是什么呢?是累加!3*2所表示的意思就是把3个2累加起来,因此这样推导下我们是可以认为加法运算与除法运算是可以互换的。恰好,这道题目没有限制使用加法,所以我们可以把除数暴力地相加,直至其和大于或刚好小于被除数时,相加的次数就是我们的目标答

2022-03-06 19:50:18 769

原创 【LeetCode - Java】22. 括号生成(中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 DFS回溯3.2 小改进+对比1. 题目描述2. 解题思路简单的中等题喜加一!当然前提是你已经做过了【LeetCode - Java】17. 电话号码的字母组合(中等)这道题,两道题的本质思想还是一样的,生成符合规则的字符串,而我个人认为这道题比那道题更进一步,多了一个规则判断(是否合规括号)。借鉴DFS的思想,我们这道题可以利用StringBuilder进行回溯生成目标字符串。要注意的地方只有一个:合规括号在数理上如何表示呢?根据我们的经验不

2022-03-05 17:59:48 604

原创 【LeetCode - Java】19. 删除链表的倒数第 N 个结点(中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 遍历两次3.2 遍历一次(数组记忆)3.3 遍历一次(双指针)3.4 对比1. 题目描述2. 解题思路好久没有碰到过这么简单的中等题了,本渣渣大喜!!!言归正传,这道题的常规思路应该是很简单的,遍历两次,第一次算出链表长度,第二次遍历到目标节点的前驱节点即可完成删除操作了。但是嘛,题目叫我尝试用一次遍历,那就试一下吧!既然我要省掉一次那显然是省第二遍了,怎么省呢?用一个带下标的数组存储所有的节点,那样在计算找到目标节点时候就可以直接从数组中取出

2022-03-05 11:57:35 696

原创 【LeetCode - Java】17. 电话号码的字母组合(中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 不构建映射表3.2 构建映射表-BFS3.3 构建映射表-DFS3.4 对比1. 题目描述2. 解题思路看到这道题的第一反应就是:先不管它,穷举出来再算!在数字2到6中,起数字与对应的字母都是有规律的,对应的字母都是3个,而开头字母与数字的ascii关系是(char - '2') * 3 + 'a',那7、8和9怎么办呢?似乎只能进行特殊判断了。ok,一个重点解决了,那如何进行这个字符串的构建呢,不就是排列组合嘛,咋们就一层一层来,这时候我想到了

2022-03-04 12:17:48 785

原创 【LeetCode - Java】15. 三数之和(中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 暴力(卒 | 时间超限)3.2 改进暴力(卒 | 时间超限)3.3 排序+双指针3.4 对比1. 题目描述2. 解题思路这道题目卡了非常久,暴力算法做不出来,优化后的暴力也不到位,而且需要去除重复的三元组。起初考虑过先排序后再找对应的三元组,这样就可以避免重复的判断提高效率,但后来又感觉排序最快也就O(nlogn) 的复杂度,似乎不太行(因为我以为官解的答案会变态地优化成 O(n) 的复杂度)…结果一看官解…好家伙还真的是先排序,然后跳过一部分的

2022-03-03 14:21:42 557

原创 【LeetCode - Java】11. 盛最多水的容器(中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 顺序暴力+跳过3.2 逆序暴力+早停3.3 双指针3.4 对比1. 题目描述2. 解题思路愣头青的我遇到这种题目还是想妄想先用暴力解法试一下,虽然心中已经做好了要超时的打算,但还是忍不住先写一下唯一能下手的思路。果然不出意外传统的暴力解法是超时的,鉴于我一下子也想不出来其他解法,于是我又开始萌生了优化这个暴力算法使其变得可用的念头。思考了一番两次for循环是雷打不动优化不掉的了,那咋整呢?只能是让某些循环跳过或停止(避免一些无意义的循环计算)

2022-03-01 10:56:29 299

原创 【LeetCode - Java】8. 字符串转换整数 (atoi) (中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 依靠long判断溢出3.2 不依靠long判断溢出3.3 对比1. 题目描述2. 解题思路这道题目要做的第一件事情是消去前导空格,这个简单,String类里面就有trim()函数是做这个事情的。第二个事情,读取首位字符,决定是正数还是负数,还是说以外的字符。在这里要注意的是,我们习惯性思维上都认为如果是正数就直接是数字了,不会出现“+”号,其实是不恰当的,一开始我也是这样思考,直到有一个“+7542”(数字随便编的忘了)的测试用例过不了。因此

2022-02-28 10:40:25 642

原创 【LeetCode - Java】5. 最长回文子串 (中等)

目录1. 题目描述2. 解题思路3. 代码实现3.1 穷举法3.1.1 小改进3.2 动态规划3.3 中心扩展3.4 对比1. 题目描述2. 解题思路遇到没有什么思路的题,决定先用暴力穷举法整一整,求出该字符串的所有子串并依次判断其是否为回文串,然后记录回文串长度的最大值与起始坐标即可。暴力果然好,但时间性能好不了,可以对暴力进行优化吗?我认真观察了一波还真的给我找到一个优化的地方。首先我在设计最初的暴力解法的时候,两层循环是这样定义的:第一层,决定子串的开始下标i,增长,判定条件为不可大于字符串

2022-02-27 16:29:34 474

原创 【LeetCode - Java】3. 无重复字符的最长子串 (中等)| 比官解更优 时间100%

目录1. 题目描述2. 解题思路3. 代码实现3.1 动态划分区域3.2 改进版一3.3 改进版二3.4 对比1. 题目描述2. 解题思路看到这条题目的瞬间脑海中就漂浮了KMP算法的身影,KMP算法是解决子串匹配问题,而这里是寻找最长子串,多少有点相似,但其实这道题目与KMP算法没什么关系。首先,这道题目的简单解法是可以利用嵌套循环来解决的,利用嵌套循环就可以找出以该字符串中的每一个字符作为开头的子串长度分别的多少,显然这种做法时间复杂度太高了,没有实际意义,我们应该寻找一下线性时间复杂度的解法。

2022-02-24 20:26:55 598

原创 【LeetCode - Java】2. 两数相加 (中等)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路这道题目我最初的思路是先把两个链表分别转换为整数再进行相加运算,试了一下之后发现用int会溢出,改用long还是会溢出,显然官方不想我们用这个方法实现,遂放弃。那么只能使用最原始的加法运算方式,个位加个位,十位加十位,也还好该链表是以倒序的形式给出,因此只需要遍历一次链表就可以完成相加进位运算了,这里的重点步骤就是要考虑何时进位。3. 代码实现public ListNode addTwoNumbers(ListNode

2022-02-24 14:07:52 546

原创 【LeetCode - Java】412. Fizz Buzz (简单)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路这道题目的思路很简单,只需要按照题意写一个简单的分支结构就可以实现了。3. 代码实现public List<String> fizzBuzz(int n) { ArrayList<String> list = new ArrayList<>(); for (int i = 1; i <= n; i++) { if (i % 3

2022-02-21 15:27:51 252

原创 【LeetCode - Java】387. 字符串中的第一个唯一字符 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 逐位判断 哈希表记忆3.2 统计次数 哈希表3.3 统计次数 数组3.4 逐位判断 数组3.5 对比1. 题目描述2. 解题思路一开始看到这条题目我就产生一种想法,我看到一个数,我再往后看看它还有没有出现不就得了?但当我尝试判断“aabb”这种字符串时发现,判断第一个a是没有问题的,但判断第二个a时后面已经是没有a的存在,会误判,因此在这个算法中必须让他有“记忆”,需要使用哈希表储存前面曾经出现的字符以免误判。实现第一种方法后发现性能不太优,既

2022-02-21 15:21:50 785

原创 【LeetCode - Java】350. 两个数组的交集 II (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 哈希表 统计3.2 数组 统计3.3 哈希表 统计 改进3.4 数组 统计 改进3.5 对比1. 题目描述2. 解题思路交集,意味着要对两个数组具有 “全局观”,“全局观”在程序中的一种体现方法就是统计,因此我可以利用哈希表,分别统计两个数组中每个元素的出现次数,然后取小值构建新的数组。由于在之前的做题中发现哈希表其实对时间性能的影响较大,在某些情况下使用数组进行代替可以大大提高运行速度,在本题目数组中的元素范围是0到1000,因此我可以构建

2022-02-18 14:50:49 658

原创 【LeetCode - Java】344. 反转字符串 (简单)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路在原数组上反转字符串的实质其实是元素的调换,把头部与尾部相应位置的元素进行交换就可以完成逆序的操作。3. 代码实现public void reverseString(char[] s) { for (int i = 0, j = s.length - 1; i < j; i++, j--) { char temp = s[i]; s[i] = s[j];

2022-02-15 11:38:00 357

原创 【LeetCode - Java】326. 3 的幂 (简单)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路常规来说,把n循环除以3取余便可以判断其是否3的幂,但既然题目要求用非循环与非递归的方法来做,那就得考虑使用数学方法了。假如n是3的幂,那么log3nlog_3 nlog3​n的结果就必定是整数,然而在java中只有lnlnln与lllg的方法实现,想要计算log3nlog_3 nlog3​n只能依靠换底公式:log3n=lnn/ln3log_3n=ln n/ln 3log3​n=lnn/ln3。看似很合理,但我们忽略了一个

2022-02-15 11:28:19 7565

原创 【LeetCode - Java】283. 移动零 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 双指针3.2 左右指针3.3 对比1. 题目描述2. 解题思路本道题可以有两种解题思路,一是移动所有零到数组的最后端,二是移动所有非零到数组的最前端。第一种思路初步想法是对数组进行双指针扫描,慢指针为主循环指针,目的是找出值为0的元素,而快指针则在慢指针前找出值不为0的元素,然后把两值调换,如此循环后,慢指针左边的就是处理好的非0的数组,而快指针右边的就是未扫描的部分,直到快指针扫描到数组末端仍然找不到非0元素则结束。第二种思路在官解中称为左

2022-02-13 17:56:36 560

原创 【LeetCode - Java】268. 丢失的数字 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 求和相减3.2 公式求和相减3.3 位运算3.4 对比1. 题目描述2. 解题思路既然已经知道数组中的数字是在0到n的范围内,那么就可以把0到n累加起来,然后减去数组中的数的累加和,就可以得出缺的数是什么了。0到n可以累加求和,也可以使用公式求和,两种方法区别不大。除此以外,我们还可以使用异或运算的方法,因为a⊕a=0,b⊕0=b,因此把数组中的数与0到n异或起来,就可以得出缺的那个数字,因为除了缺的数字以外,其他数字都出现了两遍。3. 代码

2022-02-13 11:52:00 715

原创 【LeetCode - Java】242. 有效的字母异位词 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 哈希表统计 一3.2 哈希表统计 二3.3 数组统计 一3.4 数组统计 二3.5 对比1. 题目描述2. 解题思路对于统计类的题目,哈希表仍然是一个非常好的工具,这一道题可以通过统计字符串中的字符出现个数解决,字符串s中出现了则计数 +1,t中出现了则计数 -1,具体可以有两种思路:一是,遍历完成后检查哈希表中是否value都为0;二是,在遍历过程中遇到计数为0了就从哈希表中移除,最后检查哈希表是否为空。两种方法的性能表现都区别不大,并且不是

2022-02-12 22:26:53 787

原创 【LeetCode - Java】237. 删除链表中的节点 (简单)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路这可能是我做过最简单的简单题了。数据结构中链表节点的删除是常规操作,只需要把被删除节点的前驱结点指向被删除节点的后继节点即可。但在这道题目中无法索引到被删除节点的前驱节点,因此需要把被删除节点的后继节点的值复制到被删除节点上,然后删除该后继节点即可。3. 代码实现public void deleteNode(ListNode node) { node.val = node.next.val;

2022-02-12 14:51:41 582

原创 【LeetCode - Java】234. 回文链表 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 辅助数组3.2 反转链表3.3 对比1. 题目描述2. 解题思路回文串判定的经典解题思路是利用双指针,一个指针从头开始,另一个指针从尾开始,逐位进行判断。然而,对于单向链表来说,不可以进行这种操作,怎么办呢?我们可以先把链表中的值全部转为数组进行储存,然后对该数组进行双指针的逐位比较。不过这种做法的空间复杂度是O(n),如何能做到O(1)的空间复杂度呢?那就不可以使用额外的数组进行储存了,但要做到线性时间复杂度基本上只能依靠双指针进行,意味着只

2022-02-11 14:29:46 770

原创 【LeetCode - Java】217. 存在重复元素 (简单)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路哈希表不愧是刻在DNA中的记忆了,看到这道题第一反应又是想起用哈希表解决问题,其实也可以通过排序的方法来检测重复元素,不过考虑到排序的时间复杂度较高,比不上哈希表那么简洁,遂作罢了。3. 代码实现public boolean containsDuplicate(int[] nums) { HashSet<Integer> integers = new HashSet<>();

2022-02-10 16:28:31 632

原创 【LeetCode - Java】206. 反转链表 (简单)

目录1. 题目描述2. 解题思路3. 解题思路3.1 利用栈3.2 逐位逆转3.3 对比1. 题目描述2. 解题思路一个最简单的想法就是把链表遍历后存入到栈当中,然后再弹栈构建新的链表,想法很简单,可是时间效率不高。那有方法可以遍历一次链表就可以完成反转操作吗?我们可以对链表中的节点进行逐位反转,先存储当前节点的后继节点,然后把当前节点的前驱节点指认为当前节点的后继节点,如此操作只需要遍历一次即可完成反转操作。3. 解题思路3.1 利用栈public ListNode reverseList(

2022-02-10 15:22:00 1015

原创 【LeetCode - Java】202. 快乐数 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 规律法3.2 哈希表3.3 哈希表+规律3.4 快慢指针3.5 对比1. 题目描述2. 解题思路这道题目的逻辑是很简单的,难点是在于如何判断已经循环够了,该跳出循环了?首先,如果这个数是快乐数,最终会等于1,那么就可以直接跳出循环并返回了;但是,如果这个数不是快乐数,他就会无限循环,那还有什么规律吗?我发现,对于10以下的数,只有1和7是快乐数,其他都不是,那么这就意味着当我迭代发现当前数是小于10并且不是7和1时,就该结束循环返回false了,

2022-02-09 16:53:01 742

原创 【LeetCode - Java】191. 位1的个数 (简单)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路两个思路,一是十进制转二进制的除二取余法,二是二进制的位运算,两种方式的目的都是把该二进制串中的每一位拿出来作对比,这种思路也没什么特别的,想要寻求花里胡哨的解法可以去看看官解的高级位运算。3. 代码实现public int hammingWeight(int n) { int count = 0; for (int i = 0; i < 32; i++) {

2022-01-26 17:36:28 291

原创 【LeetCode - Java】190. 颠倒二进制位 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 数值运算(C语言版)3.2 数值运算3.3 二进制运算逐位逆转3.3 对比1. 题目描述2. 解题思路题目明确这是二进制位的运算,那么我们就得从常数转换为二进制入手。最常规的方法,把常数除二取余然后直接乘对应的位权,完事了。对于C语言来说,确实是这样子的,因为在C语言当中有无符号常数uint32,但在Java语言当中就没那么顺利了。C语言几行代码可以搞定的逻辑,在Java中则需要分情况讨论,因为32位的二进制数,若最高位为1时表示的是负数(这里涉

2022-01-26 17:08:15 1188

原创 【LeetCode - Java】171. Excel 表列序号 (简单)

目录1. 题目描述2. 解题思路3. 代码实现1. 题目描述2. 解题思路这道题的本质其实就是进制转换,是一个26进制到10进制的转换,同样的按位权展开求和就可以了,没什么特别的。3. 代码实现public int titleToNumber(String columnTitle) { int sum = 0; for (int i = 0; i < columnTitle.length(); i++) { sum += (colu

2022-01-26 10:28:31 342

原创 【LeetCode - Java】169. 多数元素 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 HashSet3.2 摩尔投票算法3.3 对比1. 题目描述2. 解题思路再一次,哈希表仍然是解决这类问题刻在DNA里的记忆,只需要存储每个数的出现次数,发现大于n/2则返回即可。这道题难点在于进阶算法,时间复杂度O(n),可以,没问题,可空间复杂度O(1)就过分了吧?不都是空间换时间嘛!吐槽归吐槽,官解这投票算法确实又给我大开眼界了,它的思想是这样的:对于这个算法的正确性证明,我个人感觉官方的说法不是很好理解,但我在下面评论中发现了一个很

2022-01-25 12:35:15 581

原创 【LeetCode - Java】160. 相交链表 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 HashSet3.2 双指针3.3 对比1. 题目描述2. 解题思路对于这类型判断节点有没有visited的题目,哈希表应该是刻在DNA中的自然反应了,思路也没什么特别之处,而通常这类型题目需要压缩内存消耗的话,大多是需要依靠指针进行,这里也不例外,利用双指针分别同时进行遍历。这样做有一个问题,假如相交节点的前驱结点数目不同,没办法同时到达相交节点,这怎么办呢? 这其实正是这个思路的难点,也是巧妙之处。假如以相交节点为分界点,链表A分为a+b

2022-01-24 14:53:26 743

原创 【LeetCode - Java】155. 最小栈 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 数组+辅助数组3.2 辅助栈(Stack)3.3 辅助栈(ArrayDeque)3.4 辅助栈(LinkedList)3.5 对比1. 题目描述2. 解题思路初看这题目发现,咦?不太常规呀,这是让我撸一个栈出来吗?好像也很简单,先写吧,既然要常数时间内获取到最小值,那么除了常规存储栈的数组以外,还得需要一个辅助数组用于存储当前栈高所对应的最小值,这样就可以在常数时间内获取到了。此外,为了方便操作,可以再新增一个栈长变量,除在常规操作中可以避免反复

2022-01-24 11:03:44 598

原创 【LeetCode - Java】141. 环形链表 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 HashMap3.2 投机取巧3.3 HashSet3.4 快慢指针3.5 对比1. 题目描述2. 解题思路这个题目的常规思路应该也是很简单的,只需要遍历一下这一个链表,然后判断每一个节点是否在哈希表中:若不在则把遍历到的每一个链表都存储到一个哈希表当中,若在则表明先前已经遇到过这个节点了,即该链表存在回环,属于环形链表。哈希表可以采用HashMap或者HashSet。做完了哈希表方法之后发现时间表现并不理想,于是开始寻找新的突破口。这时候我留

2022-01-22 22:29:24 948

原创 【LeetCode - Java】136. 只出现一次的数字 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 HashMap3.2 异或运算3.3 对比1. 题目描述2. 解题思路倘若不看题目中的说明,这道题目是非常简单的,做法也有很多。如果不限制时间复杂度为线性的话,我们可以先把数组进行排序,然后判断就很方便了,但这里限定的时间复杂度为线性,排序自然而然就不行了。在不考虑空间复杂度的情况下,可以通过构造一个HashMap,若HashMap中没有这个数则存入,有这个数则删除,那么遍历一遍过后HashMap中剩下来的就只有目标数了,然而限定不使用额外空间

2022-01-22 12:28:39 659

原创 【LeetCode - Java】125. 验证回文串 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 双指针3.2 系统函数小对比1. 题目描述2. 解题思路这应该是属于非常纯正的双指针题目了,用系统函数全部转为小写(当然大写也是可以的),一个指针从头开始,一个指针从后开始,排除非字母和数字后直接比较就完事了。没什么特别的,单纯记录一下吧。3. 代码实现3.1 双指针public boolean isPalindrome(String s) { s = s.toLowerCase(); int i = 0,

2022-01-22 10:56:20 431

jdk-8u181-windows-x64.rar

jdk1.8版本windows下载,

2020-06-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除