LeetCode题解
记录自己对题目的理解和Java代码实现
adrian_h
想要变得优秀
展开
-
LeetCode题目:53. 最大子序和 解题思路及Java实现
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。解题思路:使用贪心算法即可。每次循环如果sum<0 直接将sum置为0即可。Java代码:public class Demo53 { public int maxSubA原创 2020-12-18 16:51:29 · 99 阅读 · 1 评论 -
LeetCode题目:49. 字母异位词分组 解题思路及Java实现
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]说明:所有输入均为小写字母。不考虑答案输出的顺序。解题思路 :将每个字符串转为字符数组,然后用Array.sort()排序,排序后再转为字符串,作为key存储到hashmap中,hashmap的value是一个l原创 2020-12-07 22:25:17 · 152 阅读 · 0 评论 -
LeetCode题目:46. 全排列 解题思路及Java实现
题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:回溯法。通过一个另外的数组来标记哪些位置上的元素被使用过了。代码:package top100;import java.util.ArrayList;import java.util.List;public class Demo46 { List<List原创 2020-11-25 17:05:55 · 134 阅读 · 0 评论 -
LeetCode题目:39. 组合总和 解题思路及Java实现
题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target = 8原创 2020-11-23 19:38:53 · 291 阅读 · 1 评论 -
Leetcode题目:34. 在排序数组中查找元素的第一个和最后一个位置 解题思路及Java实现
给定一个按照升序排列的整数数组 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]解题思路:给定的数组为排序好的数组,不需要再排序,要求复杂度为O(log原创 2020-11-18 11:14:48 · 149 阅读 · 0 评论 -
LeetCode题目:32. 最长有效括号 思路及Java实现
题目:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”思路:字符串转为字符数组,将所有可以匹配的字符数组的下标记录下来,找到最长连续数列的长度,就是最长有效括号的子串的长度。Java实现:package top100;import java.util.ArrayList;import j原创 2020-11-16 17:12:51 · 212 阅读 · 0 评论 -
LeetCode题目:23. 合并K个升序链表 解题思路及Java实现
题目:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:lists = []输出:[]原创 2020-11-13 16:58:07 · 182 阅读 · 0 评论 -
LeetCode题目:22. 括号生成 解题思路及Java实现
题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n = 3输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]解题思路:深度优先遍历的实践,这里用递归实现。递归方法需要传入代码:package top100;import java.util.ArrayList;import java.util.List;public class Demo22 { pri原创 2020-11-12 16:07:27 · 187 阅读 · 0 评论 -
LeetCode题目:21. 合并两个有序链表 解题思路及Java实现
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:递归也很简单,这里先不用递归的方法,定义一个游标和虚拟头节点,游标先指向头节点,比较两链表的当前节点的值,取较小的那个节点赋给游标的next域,然后让游标后移一位,当任意一个链表遍历到头,让游标的next域指向另外一个链表当前遍历到的节点。代码:package原创 2020-11-10 16:20:38 · 154 阅读 · 0 评论 -
LeetCode题目:20. 有效的括号 解题思路及Java实现
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路:栈的灵活运用。将字符串转为字符数组,遍历数组,遇到{ [ ( 分别将它们的反括号压入栈,遇到 } ] ) 就弹出栈顶元素,看是否和遍历到的字符一致,如果栈为空或者匹配不成功,返回false,最后返回的时候要判断栈里是否还有反括号。代码:package top100;原创 2020-11-09 18:26:15 · 145 阅读 · 0 评论 -
LeetCode题目:19. 删除链表的倒数第N个节点 解题思路及Java实现
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?思路:定义两个指针,第一个指针先后移n位,然后两个指针一起后移,当第一个指针到达链表尾部,第二个指针指向的就是倒数第n个节点的前一个节点。package code;public c原创 2020-11-05 15:58:17 · 204 阅读 · 0 评论 -
LeetCode题目:17.电话号码的字母组合 解题思路及Java实现
题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。思路:典型的递归题目Java实现:package code;import java.util.ArrayList;import jav原创 2020-11-04 20:44:11 · 126 阅读 · 0 评论 -
LeetCode题目:15. 三数之和 思路及Java实现
题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]思路:三数相加等于零等同于两个数的和等于另一个数的相反数。先将数组排序,方便遍历,然后定义三个指针,sum、left、right,sum指向原创 2020-11-04 20:37:21 · 859 阅读 · 0 评论 -
LeetCode题目:11. 盛最多水的容器 解题思路及Java实现
题目:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。如图:所求矩形面积的宽为较短的高度。(不能倾斜)思路:由于取的是较短的那个边的高度为矩形的宽,所以,定义两个指针,分别指向数组的左右边界,比较两边的大小,较短的边界向中间移动,每移动一次,重新比较两边的高度,计算矩形的面积,原创 2020-11-03 17:19:56 · 140 阅读 · 0 评论 -
LeetCode题目:5. 最长回文子串 解题思路及Java实现
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”思路:将字符串转为字符数组,定义两个指针,left和right分别指向第一个元素和第二个元素,right往后移,遍历数组,每次后移,判断left和right中间是否存在回文子串,存在的时候记录回文子串的长度和最左、最右两个字符的索引,下一次获取到回文子串的时候比较该原创 2020-11-03 16:20:47 · 160 阅读 · 0 评论 -
LeetCode题目:3.无重复字符的最长子串 两种解题思路及Java实现
题目:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。思路:题目要求找出的是长度,首先将字符串转为字符数组,然后定义两个指针,通过右指针遍历数组,右指针每后移一位,就判断它当前指向的元素和它与左指针中间范围的字符有没有重复的,如果存在,这时字串长度为right-left,让左指针指向那个重复元素的后一个元素,继续后移右指针,右指针移动的时候,一直记录最长子串长度,如果碰到前面有重复元素,子串长度为right-left+1。static int lengthOfLongestSubstrin原创 2020-11-02 09:15:47 · 223 阅读 · 0 评论 -
LeetCode题目:2.两数相加 解题思路及Java实现
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。例如:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路:题目里给的是各自的位数是按照逆序存储的,所以从低位开始相加,主要是要原创 2020-10-28 20:19:50 · 224 阅读 · 0 评论 -
LeetCode题目:1.两数之和 解题思路及Java实现
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。思路:两数的和已知,可以遍历数组,计算target减去数组元素的值,将它作为key,遍历到的数组元素下标作为value存到map中,下一次循环通过containsKey来查map中是否有可以和当前元素相加等于target的key,如果有的话取出value,这样一来就能取到两个下标了。代码:package cod原创 2020-10-28 20:09:56 · 200 阅读 · 0 评论