leecode
文章平均质量分 56
烛承幻
这个作者很懒,什么都没留下…
展开
-
leetcode 137——只出现一次的数字II——java实现
1.题目描述2.分析由于题目要求该算法的时间复杂度为线性,所以不能使用暴力法来解决。线性复杂度应该考虑使用HashMap或HashSet。由于对HashMap比较熟悉,所以利用HashMap来解决该问题。具体思路为:遍历数组,如果没有出现过这个数字,则value为1,如果出现过这个数字,则value为当前value的值+1.然后再遍历HashMap的key,如果这个key的value值为1,则return这个key,否则就return -1.3.具体代码如下class Solution {原创 2021-03-05 19:59:40 · 192 阅读 · 0 评论 -
leetcode 108——将有序数组转换为二叉搜索树——java实现
题目要求:分析:将数组的中间一个数值作为根结点,然后利用递归对其左子树和右子树进行操作。具体代码为:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { publi原创 2020-12-31 11:54:55 · 145 阅读 · 0 评论 -
leetcode 107——二叉树的层序遍历 II——java实现
题目描述:分析:正好昨天做过一道题目:leetcode103——二叉树的锯齿形层序遍历——java实现在这道题目中,利用了add(int index, E element)方法,如果一直往第一的位置add进去的话,前面add进去的数值会往后挪,并不会被替换,这道题目同样可以利用该方法来解决问题。具体代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * Tre原创 2020-12-31 10:58:23 · 137 阅读 · 0 评论 -
leetcode 106——从中序与后序遍历序列构造二叉树——java实现
题目要求:分析:这道题目跟leetcoe105——从前序与中序遍历序列构造二叉树——java实现是姊妹题。中序遍历:左根右后序遍历:左右根解题思路为:后续遍历的最后一个值是根值,记为root,然后去中序遍历中寻找与root值相等的值,将其位置记为index。index的左边,为这棵树的左子树;index的右边,为这棵树的右子树。然后进行递归即可,注意要设置好递归结束条件。具体代码如下:/** * Definition for a binary tree node. * public c原创 2020-12-31 10:40:23 · 135 阅读 · 0 评论 -
leetcode103——二叉树的锯齿形层序遍历——java实现
题目要求:分析:这是一道典型的BFS题目,在leetcode102——二叉树的层次遍历——java实现中再加一个反转步骤就可以了。反转的判断依据,可以利用奇偶性判断,也可以利用true和false进行判断。具体实现如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * Tr原创 2020-12-30 17:41:51 · 179 阅读 · 0 评论 -
leetcode119—— 杨辉三角 II——java实现
题目要求:分析:这道题目跟118题差不多,只是返回值不一样而已。在这道题中,只需要将返回值返回到rowIndex那个集合就OK了。具体代码如下:class Solution { public List<Integer> getRow(int rowIndex) { List<List<Integer>> list1 = new ArrayList<>(); for(int i = 0; i <= rowI原创 2020-12-17 20:24:58 · 141 阅读 · 0 评论 -
leetcode118—— 杨辉三角——java实现
题目要求:给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。分析:懒得说了,如下图所示具体代码如下:class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> list1 = new ArrayList<>();原创 2020-12-17 19:31:00 · 153 阅读 · 0 评论 -
leetcode83——删除排序链表中的重复元素——java实现
题目要求:分析:我是因为看到这道题目可以用递归,才来做的,结果,第一反应永远是直接暴力的方法……直接上代码吧具体代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode原创 2020-12-11 11:27:07 · 184 阅读 · 0 评论 -
leetcode50——Pow(x, n)——java实现
题目要求:分析:第一反应是暴力法,暴力法是超出时间限制的。那么可以考虑使用折半的方法,进行递归。利用之前那篇博客中的三步法进行分析:找整个递归的终止条件:递归应该在什么时候结束?找返回值:应该给上一级返回什么信息?本级递归应该做什么:在这一级递归中,应该完成什么任务?1.终止条件:折半运算到最后一个n值,考虑到奇偶性,且正负情况不一样,有三种情况,分别为-1, 1, 0;2.返回值:给上一级返回的信息就是它们的乘积;3.如下图:具体代码如下:class Solution {原创 2020-12-11 10:19:20 · 207 阅读 · 0 评论 -
leetcode58——最后一个单词的长度——java实现
题目要求:分析:这道题目要从末尾开始遍历,思路很简单,但是!!!要注意后面是“ ”的情况!!!不然就会报错!!!具体代码如下:class Solution { public int lengthOfLastWord(String s) { int length = 0; for(int i = s.length()-1; i >= 0; i--) { if(s.charAt(i) == ' ' && lengt原创 2020-12-10 16:50:54 · 129 阅读 · 0 评论 -
leetcode86——分隔链表——java实现
题目要求:分析:对于这道题目,只要定义两个链表,一个链表存放<x的值,另一个链表存放≥x的值即可。这里要注意,链表最后一个值的next一定要指向null,不然会报如下错误:Error - Found cycle in the ListNode具体代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * Lis原创 2020-12-10 16:25:45 · 303 阅读 · 0 评论 -
leetcode110——平衡二叉树——java实现
题目要求:分析:刚才看了那篇博客:三道题套路解决递归问题这道题目在作者博客里提到,也是关于递归的,所以也就顺着作者的思路给做了。由于这道题目比较特殊,就是又要判断是true还是false,又要根据高度差来判断,所以需要自己去创建一个类,让这个类既包含boolean类型,又包含int类型。具体代码为:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNo原创 2020-12-08 15:30:37 · 212 阅读 · 0 评论 -
leetcode24——两两交换链表中的节点——java实现
题目要求:分析:碰到链表的题目,会条件性反射地想到:利用哑结点来帮忙,在这道题目中,也确实可以利用哑结点来帮忙做事情。其实这道题目跟旋转链表的做法很像,思路如下图所示,非常清晰明了。具体代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int va原创 2020-12-08 14:22:30 · 160 阅读 · 0 评论 -
leetcode1030——距离顺序排列矩阵单元格——java实现
题目要求:分析:第一反应永远是暴力法……遍历矩阵,设置一个二维数组用来存放结果,用数组中的sort方法进行排序,具体方式为:重写sort()方法中的compare方法。注:在compare(int[] a, int[]b)中,如果前者 - 后者,则是升序排序;如果后者 - 前者,则是降序排序。具体代码如下:class Solution { public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {原创 2020-11-17 16:29:32 · 150 阅读 · 0 评论 -
leetcode25——K 个一组翻转链表——java实现
题目要求:分析:这道题目包含链表反转,所以可以调用反转链表那道题目。传送门:反转链表既然知道如何反转链表,那么只需要对整个链表根据k来进行断开即可。断开之后,调用反转链表方法,再将后面的接上,如此循环,直到最后。在这里,要注意的一点有:如果节点总数不为k的整数倍,则保持原有顺序。具体思路如下图:具体代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; *原创 2020-11-16 22:42:34 · 163 阅读 · 0 评论 -
leetcode12——整数转罗马数字——java实现
题目描述解题思路代码中返回的类型是String类型,转成的罗马数字是一个一个累上去的。如:1994,是由1000(M),900(CM),90(XC),4(IV),累上去的。由于返回的类型是String类型,并且又是累上去的,就想到用StringBuilder的append()方法,到了最后用toString()方法来return即可。接着,题目中给出了一些特殊的数字,这些数字分别为:...原创 2020-03-13 20:13:46 · 184 阅读 · 0 评论 -
leetcode2——两数相加——java实现
题目要求:在这里:1.定义一个dummyHead来表示一个新节点,最初时新链表所指向的就是dummyHead;2.然后用p指向第一个链表l1,q指向第二个链表l2;3.定义一个进位,其值为1或0;4.令p所指向的值为x,q所指向的值为y,再将两者进行相加放入新链表中:如果有进位,则令carry = 1,再令p和q分别指向链表中的下一个节点;如果没有进位,则令carry = 0,再令...原创 2019-07-29 11:07:40 · 167 阅读 · 0 评论 -
leetcode3——无重复字符的最长子串——java实现
题目要求:分析:由于不能重复,所以首先就考虑到利用HashSet,HashSet底层利用的也是HashMap,但是HashSet中的内容不能重复。由于返回的值是子串的长度,所以需要定义一个count来计数。1.根据滑动窗口的思想,定义start和end两个变量,它们在最开始时均指向字符串s的第一个字符;2.定义一个HashSet,用来存放符合题目条件的子串;3.对整个字符串s的每个字...原创 2019-07-29 16:24:09 · 223 阅读 · 0 评论 -
leetcode1——两数之和——java
题目要求:分析:暴力法就不说了。这里利用HashMap做会很爽。注意这里的key和value是倒的。即:nums数组中的值是key,而nums数组的index是其对应的value.代码如下所示:class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integ...原创 2019-07-29 19:29:14 · 82 阅读 · 0 评论 -
leetcode20——有效的括号——java实现
题目要求:分析:有一种优美的数据结构,叫栈(stack),这道题就是用这种美丽的数据结构来解决的。拿到题目之后,我们需要先对题目进行分析。先看第一个要求:这个操作简单,我们可以直接利用计数来解决,设置三种不同的计数器,当遇到’(’, ‘[’, '{'时就令其各自的计数器+1,然后遇到它们的另一半时令计数器-1,到最后的时候看看计数器的值是不是0就OK了。但是题目是永远不会这么简单滴...原创 2019-08-02 15:46:28 · 280 阅读 · 0 评论 -
leetcode21——合并两个有序链表——java实现
题目要求:分析:这道又是关于链表的题目,拿到链表的题目,就要想到dummy大法好。由于题目要求我们不能开辟一个新的空间来存储链表,所以我们需要在l1和l2的基础上进行排序。具体步骤如下:设置好了dummy之后,我们设置一个节点,令node指向dummy,即node = dummy;然后对l1和l2中的每个节点进行遍历:如果l1中的节点值大于l2中的节点值,那么这个节点的值就为l2当...原创 2019-08-02 16:35:29 · 493 阅读 · 0 评论 -
leetcode22——括号生成——java实现
题目要求:分析:这道题目利用递归。具体思路如下:观察题目,返回的是一个集合,所以要new一个list;设置left和right来分别代表’ ( ‘和’ ) '剩余的个数,初始个数均等于n;根据left和right的值的关系来判断应该是加’ ( ‘还是’ ) ‘:当right > left时,此时可加入’ ) ‘,再进行递归。注意right是绝对大于等于left的,因为无论怎样...原创 2019-08-02 21:21:25 · 231 阅读 · 0 评论 -
leetcode23——合并K个排序链表——java实现
题目要求:分析:看到这道题目的时候,马上就想到了21题:将2个有序链表排序的题目。21题就是这道题的特殊情况。那我们就可以考虑将21题进行“废物利用”,即直接调用21题的方法来解决这个问题。我们可以采用分而治之的思想,即将K个链表两两对比,排好序,然后再进一步进行两两对比。具体思想可以参照“快速排序”。首先,我们用设置left和right两个指针,分别指向存储所有链表的数组的头和尾;...原创 2019-08-03 15:28:01 · 969 阅读 · 0 评论 -
leetcode31——下一个排列——java实现
1.题目要求:2.分析:刚拿到这道题目的时候,我完全没有思路,于是去看了标准答案的分析过程。首先来看看什么叫字典序,在百度百科中是这样说的:对于数字1、2、3…n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是...原创 2019-08-03 16:55:46 · 976 阅读 · 0 评论 -
leetcode32——最长有效括号——java实现
题目要求:分析:之前做过类似的题目,就是括号匹配,我们是用栈做的,这里依旧可以故技重施。刚开始我没仔细看题,直接写了如下代码:class Solution { public int longestValidParentheses(String s) { if(s == null || s.length() == 0) return 0; ...原创 2019-08-03 21:03:22 · 680 阅读 · 1 评论 -
leetcode33——搜索旋转排序数组——java实现
题目要求:分析:题目要求不难理解,如果抛开时间复杂度,就是一道非常简单的题目,但是,它要求我们时间复杂度是O(log n)级别。虽然给出的数组是经过旋转的,但是我们仍然可以将其看成是有序数组。由于复杂度要求为log n级别,那么就应该用二分查找法来做。在该题中,我们不知道它旋转的中心点在哪里,所以我们需要分情况,如下图所示:我们将其分成两个大类:一、 nums[middle] &g...原创 2019-08-03 22:06:26 · 256 阅读 · 0 评论 -
leetcode34——在排序数组中查找元素的第一个和最后一个位置
题目要求:分析:从题目中可以看到,给出的nums数组是有序的,并且要求时间复杂度是log n,那么肯定使用二分法。这里要求我们找到给定元素的第一个和最后一个位置,那么首先我们需要找到指定的元素,如果没有这个元素,就返回[-1, -1],如果有这个元素,那么我们还需要进行如下操作:在查找到的元素的左边进行查找,如果有与target相等的元素,则记录下它的坐标,直到找不到与target相等...原创 2019-08-04 20:22:06 · 147 阅读 · 0 评论 -
leetcoe39——组合总和——java实现
题目要求:分析:这是一道深度优先遍历算法题目,并且为了避免重复的解,还涉及到剪枝算法。总体思想我参考了标准答案,网址为:添加链接描述我把他的图拿过来,这道题目就很清晰明了了,如下所示:这个图真的是不要画得太好。剪枝算法就是为了去掉途中绿色框框框起来的部分(它们是重复的)。看到这种类似于树的结构,我们条件反射就要想到利用递归。没有递归完的时候,它们剩下的值都是大于0的,而递归完之后,...原创 2019-08-04 21:58:43 · 136 阅读 · 0 评论 -
leetcode5——最长回文子串——java实现
题目要求:分析:看到这种回文的题目,就会想到:以某一个数字为中心来进行处理。我们抽取一个方法,用以实现下面所述的功能:在babad中,首先以第一个b为中心,来判断它距它等距离的左边和右边的字母是否是相等的。当然第一个b是没有什么可比较性,因为它左边没有字母。然后再以第二个字母a为中心,与它等距离(这里距离为1)的左右两个字母分别为左边的b和右边的b,经过比较发现它们两个相等。再看看与这...原创 2019-07-31 20:00:53 · 741 阅读 · 0 评论 -
leetcode42——接雨水——java实现
题目要求:分析:看到题目的时候,从哪方面去想很重要。我第一眼看到这道题目的时候,就想到了leedcode11——盛最多水的容器——java实现,于是也就自然而然地想到了设置两个滑动指针的想法。在这题中,我们要求的也是面积,但求的是蓄水面积。按照我们定义滑动指针的惯例,我们首先定义两个指针left和right,分别指向height数组下标为0和height.length - 1处,再对he...原创 2019-08-05 10:51:43 · 527 阅读 · 0 评论 -
leetcode48——旋转图像——java实现
题目要求:分析:关于矩阵变来变去的这种题目,首先要想到矩阵的转置,先将矩阵转置之后,再看看如何变换。以示例2中的matrix举例,如下所示:过程就没有什么好说的了,思路特别清晰,就一句话,先转置,再交换。交换的时候,我们设置两个指针left和right,分别向中间逼近。代码如下:class Solution { public void rotate(int[][] matr...原创 2019-08-05 18:52:02 · 252 阅读 · 0 评论 -
leetcode49——字母异位词分组——java代码
题目要求:分析:由示例中的输出可得,这是一个大集合嵌套着若干个小集合,这种输出是很熟悉的,就是new两个集合就完事了。再看题目要求,它让我们把异位词进行分组,那么我们就应该要想到,遍历这个数组strs的时候,我们将每个strs[i]中的字母进行排序,然后new一个HashMap,将它们作为key,strs[i]的值作为value。由于我表达能力有限,直接上一个例子:这个例子在leet...原创 2019-08-05 20:35:38 · 181 阅读 · 0 评论 -
leetcode53——最大子序和——java实现
分析:这道题目使用动态规划来做。我们设置两个变量,一个为result,用来存放最终结果,一个为sum,用来存放当前的和。每次得到sum时,与result进行比较,取大的那个当作最终result值。那么我们如何求sum呢?在示例中,我们可以看到,nums数组中的数字有正有负。我们要找到连续数字的最大和,就必须要对nums数组进行遍历。在遍历的时候,分两种情况:如果此时的sum值大于0...原创 2019-08-05 21:33:52 · 171 阅读 · 0 评论 -
leetcode46——全排列——java实现
题目要求:我对递归和回溯问题根本就没有很好的理解,只知道要这么做,但是不知道为什么要这么做,所以具体看了一下大牛们写的博客:回溯算法超通俗易懂详尽分析和例题这一篇开始写得蛮好的还有一个是:怎么更好地终极理解递归算法这一篇把概念讲得非常详细分析:这道题目用的是递归 + 回溯...原创 2019-08-05 21:41:06 · 299 阅读 · 0 评论 -
leetcode10——正则表达式匹配——java实现
题目要求:分析:这道题最难处理的是*,涉及到*的时候,需要进行回溯。所以这种题目就要考虑使用递归法,先对两个字母进行判断,然后再不断调用自身的方法以达到目的。只要把所有的情况都给考虑进去,那这道神烦的题目就可以迎刃而解了。一、 考虑p为空的状态:此时如果s为空,则返回true,如果s非空,则返回false;二、 考虑p不为空的状态:先考虑简单的情况:即p的第二个字母不为*时,有以...原创 2019-08-01 20:37:55 · 667 阅读 · 0 评论 -
leedcode11——盛最多水的容器——java实现
题目要求:分析:这道题目一拿到手就会想到利用两个指针来滑动,分别设置为left和right,然后求面积。值比较小的那个指针进行变化。废话不多说,直接上代码:class Solution { public int maxArea(int[] height) { int left = 0, right = height.length - 1; int ...原创 2019-08-01 21:04:26 · 155 阅读 · 0 评论 -
leetcode78——子集——java实现
题目要求:分析:这道题目采用我最讨厌的递归+回溯来做。画一个图就能明白,如下所示:这样就很明确了,具体代码如下:原创 2019-08-08 11:26:27 · 590 阅读 · 0 评论 -
leetcode55——跳跃游戏——java实现
题目要求:分析:这道题目利用贪心算法的思想来做会比较简单。关于贪心算法,可以大致看一下这位大神写的博客:算法(六):图解贪婪算法对于本题,我们应该这样思考:定义一个变量temp,用其来表示它能跳得最远的距离:当temp的值与该数组的长度相等,或者比该数组的长度大时,就证明它里面肯定存在至少一种跳法,能够刚好跳到最后一步;当temp的值比遍历到的i的值要小时,就证明它跳不到最后一步...原创 2019-08-06 09:46:13 · 335 阅读 · 1 评论 -
leetcode56——合并区间——java实现
题目要求:分析:这道题目的思路其实应该很清晰,一共分为以下几个步骤:将给出的区间集合进行排序,将其左闭区间按照从小到大的顺序进行排列;设置一个list集合,进行遍历和判断:将能合并的进行合并,再add进list中;不能合并的就直接add进list中;将最终得到的list利用toArray方法转成一个二维数组。这里有一个难点,就是如何将这个区间集合进行排序,感谢这位大神的分享:...原创 2019-08-06 11:11:11 · 438 阅读 · 0 评论 -
leetcode15——三数之和——java实现
题目要求:分析:这道题目最烦的一点就是要不断地进行优化。我最初写好的雏形代码是超出时间限制的,所以优化的过程也是一点一点来的。OK,先不说优化的问题,先说一说拿到这道题目我是如何思考的。由于我们想要找到三数之和为0的三个数,并且放在集合中,脑海里首先就应该要想到:(1) 将nums数组进行排序,并设置left和right两个指针,分别先指向头跟尾,往中间夹击;(2) 结果要要放在一...原创 2019-08-02 09:33:00 · 497 阅读 · 0 评论