刷题篇
文章平均质量分 88
哗哗的世界
点点关注,共同进步
展开
-
031.下一个排列Java实现
观察nums = [1,3,4,2] -> nums = [1,4,2,3]这一步,因为4比3大,且4的位置在3之后,所以将4与3交换,必然能够使得nums变大,交换了之后,则变成了nums = [1,4,3,2]。但显然这不是最小的比nums = [1,3,4,2]大的一个排列,我们还要把3和2的位置再翻转一下,才能得到nums = [1,4,2,3]这个。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。原创 2024-05-11 21:08:55 · 630 阅读 · 0 评论 -
028.实现 strStr()
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。简单输入:haystack = "sadbutsad", needle = "sad"输出:0解释:"sad" 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。输入:haystack = "leetcode", needle = "leeto"原创 2024-05-11 21:06:25 · 760 阅读 · 0 评论 -
删除有序数组中的重复项
输入:nums = [1,1,2] 输出:2, nums = [1,2] 解释:返回新数组的长度 2,并且原数组 nums 的前两个元素被修改为 1, 2。输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:方法应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。原创 2024-04-09 13:33:39 · 583 阅读 · 0 评论 -
移除元素Java实现
遍历结束后,j 的位置就是新数组的长度,因为它指向了第一个“空闲”的位置,也就是第一个没有被复制过的元素的位置。例如,方法返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。Java 并不存在引用传递,只有值传递,数组是一种特殊的对象,传递的是对象在堆中的地址,所以在方法中修改数组的内容是会影响到调用者的。输入:nums = [0,1,2,2,3,0,4,2], val = 2。输入:nums = [3,2,2,3], val = 3。原创 2024-04-09 11:26:47 · 450 阅读 · 0 评论 -
删除链表的倒数第 N 个节点
引入虚拟头节点后,删除头节点和其他节点的操作可以统一处理,因为头节点也会有一个前节点(即虚拟头节点)。找到节点后,将节点的前一个节点的 next 指向节点的下一个节点;将节点的下一个节点的 prev 指向节点的前一个节点,这样就将节点从链表中删除了。为了方便删除节点,我们需要一个虚拟节点,让虚拟节点的 next 指向 head,这样就能保证删除节点的前一个节点不为空。倒数第 4 个节点的前一个节点就是 5-4=1,也就是第一个节点。第一步,遍历链表,找出链表的长度,确定要删除的节点的位置。原创 2024-04-08 16:57:08 · 829 阅读 · 0 评论 -
Java实现两数相除
题目要求不能用除法,不过我们处理溢出情况的写法,后面还是要用到的,尤其是 (long) dividend 这个强转的处理,其实就考察了基本数据类型的转换问题,包括最后返回的 (int) result,都是很细节的问题,但却很重要。很遗憾,前 5 个测试用例都是可以顺利通过的,但最后 1 个测试用例耗时会特别长,因为要计算 2147483648 / 1次,这个数太大了,所以我们要想办法优化一下。在数学中,加法是加减乘除的基础,减法是加法的逆运算,乘法是加法的倍增,除法是乘法的逆运算。原创 2024-04-04 13:58:26 · 941 阅读 · 0 评论 -
最接近的三数之和
另外一个点是移动左指针还是右指针,当 sum 大于 target,说明 sum 太大了,需要减小 sum,那么就移动右指针,反之,如果 sum 小于 target,说明 sum 太小了,需要增大 sum,那么就移动左指针。那刷题其实就是这样,学会举一反三,遇到不同的题型,尽量去找到和它相似的题型,能不能按照之前的解题思路快速把这道题解出来,解出来后再想办法去优化。当输入是 nums = [-1,2,1,-4], target = 1 的时候,就需要移动左指针,因为 sum 太小了,需要增大 sum。原创 2024-04-01 16:48:58 · 876 阅读 · 0 评论 -
实现三数之和
对于题解 1 来说,很好掌握,因为有两数之和的基础,但效率不高。对于题解 2 来说,边界条件有点多,比如说第一层 for 循环要以。原创 2024-03-31 16:53:20 · 845 阅读 · 0 评论 -
002.Java实现两数相加
假设两个链表相同位置的数字分别是 addX 和 addY,进位是 up,那么它们的和(sum)就是 addX + addY + up,如果 sum 大于 10 的话,需要进位,那么进位的值就是 sum / 10,而 sum % 10 就是当前位置的数字。十位 4+6+1=11(此时进位为 1),由于和大于 10,所以百位的进位就是 1(sum / 10), 十位的数字就是 1(sum % 10)。其实计算机中的大多数思想都是这样的,当一个问题超复杂时,我们就简化它,把它拆分成一个个小问题,然后再去解决。原创 2023-12-16 21:25:00 · 102 阅读 · 0 评论 -
001两数之和
对于本题,我们用到了 Java 中的一个普通 for 循环,和一个 HashMap,这两个都是 Java 中必须掌握的知识,如果你对这两个都不熟悉,那么你的 Java 基础还是不够扎实。来记录数组中的每一个元素,元素的索引作为哈希表的 key,元素本身作为 value,当发现target - i在哈希表中存在时,就可以直接返回这两个数的索引了。时间复杂度,在算法领域是一个非常重要的概念,一个衡量算法执行时间随输入数据规模增长而增长的度量。哦吼,这次结果就不一样了,打败了 71% 的选手,效果显著。原创 2023-12-11 09:42:02 · 133 阅读 · 0 评论 -
二叉树的中序遍历-94
递归处理是处理树形结构中最常用的一个操作,因为树的结构本质与递归殊途同归,在逻辑结构上二者十分近似,所以在学习树结构时,我们通常都可以类比递归,并从中获得启发。前序遍历、中序遍历、后序遍历是二叉树的三种基本遍历方式,它们的主要区别在于访问根节点的时间。对于这道题,我们需要先搞清楚,什么是二叉树的中序遍历。根据以上描述,结果列表res为:[1, 3, 2]。给定一个二叉树的根节点 root ,返回它的。输入:root=[1,null,2,3]输入:root=[1]输出:[1,3,2]输入:root=[]原创 2023-11-25 18:54:31 · 53 阅读 · 0 评论 -
验证二叉搜索树-98
在这个题解中,使用 Long 类型的 MIN_VALUE 和 MAX_VALUE 作为边界,是因为二叉搜索树的定义中对于任何节点来说,其左子树上的所有节点的值都要小于该节点的值,而右子树上的所有节点的值都要大于该节点的值。如果我们仅使用 Integer 类型的边界来初始化,那么当根节点的值恰好是 Integer.MIN_VALUE 或 Integer.MAX_VALUE 时,我们就无法设置一个比 Integer.MIN_VALUE 更小或比 Integer.MAX_VALUE 更大的边界值了。原创 2023-11-25 10:10:52 · 26 阅读 · 0 评论 -
恢复两节点被交换的二叉搜索树-恢复二叉搜索树-99
在 AVL 树中,对于任意节点,其左子树中的所有值都小于该节点的值,其右子树中的所有值都大于该节点的值。很显然,如果有两个节点的位置恰好被错误的交换,那么中序遍历的时候,单调递增的特征就会被破坏掉,而此时,我们只需要找出这两个错误调换的节点,就能恢复二叉搜索树了。因为中序遍历是先遍历左子树的,而左子树的值都比当前节点的小,然后是当前节点,再然后遍历右子树,而右子树的值又比当前节点的大。这样我们便可以找出交换过的节点,下一步,交换这个两个节点就能恢复原始的二叉搜索树了。解释:3不能是1的左孩子,因为3>1。原创 2023-11-24 17:32:25 · 65 阅读 · 0 评论 -
刷题之-判断两棵树是否相同-100
简单的代码,简单的思路,背后蕴藏着的其实是我们不断锤炼的解题能力。原创 2023-11-24 16:31:05 · 61 阅读 · 0 评论