- 博客(183)
- 收藏
- 关注
原创 leetcode140. 单词拆分 II
给定一个字符串s和一个字符串字典wordDict,在字符串s中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序返回所有这些可能的句子。注意:词典中的同一个单词可能在分段中被重复使用多次。...
2022-08-14 21:55:28
303
1
原创 leetcode473. 火柴拼正方形
你将得到一个整数数组matchsticks,其中matchsticks[i]是第i个火柴棒的长度。你要用所有的火柴棍拼成一个正方形。你不能折断任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次。如果你能使这个正方形,则返回true,否则返回false。做法一致,把k改为4即可。...
2022-08-10 22:55:47
366
原创 leetcode113. 路径总和 II
给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。2.层序迭代跟求所有路径差不多。
2022-07-15 11:42:33
274
原创 leetcode257. 二叉树的所有路径
1.题目描述:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。2.回溯:3. 广度迭代:层序依次遍历节点,并记录每一条路线。......
2022-07-14 17:04:05
270
原创 leetcode222. 完全二叉树的节点个数
1.题目描述:给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2h个节点。2.层序遍历:3.递归:前序遍历:最优解: 4.借助完全二叉树的性质:见leetcode题解。...
2022-07-14 10:15:28
139
原创 leetcode559. N 叉树的最大深度
1.题目描述:给定一个N叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。2.递归:3.层序遍历:...
2022-07-13 11:54:04
130
原创 leetcode100. 相同的树
1.题目描述:给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。2. 递归:方法与leetcode101. 对称二叉树一致。3.迭代:方法与leetcode101. 对称二叉树一致。...
2022-07-13 10:51:24
203
原创 leetcode117. 填充每个节点的下一个右侧节点指针 II
1.题目描述:2.层序遍历:代码与leetcode116. 填充每个节点的下一个右侧节点指针一摸一样,这种解法与二叉树的形状无关。3.直接迭代:详见注释。
2022-07-09 23:18:53
121
原创 leetcode116. 填充每个节点的下一个右侧节点指针
1.题目描述:2. 层序遍历:3.直接迭代:根据上层next指针来实现,降低空间复杂度。
2022-07-09 21:05:30
110
原创 leetcode515. 在每个树行中找最大值
1.题目描述:给定一棵二叉树的根节点root,请找出该二叉树中每一层的最大值。2.层序遍历:3.递归,深度优先:
2022-07-09 16:04:34
121
原创 leetcode429. N 叉树的层序遍历
1.题目描述:给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由null值分隔(参见示例)。2.层序遍历:
2022-07-08 18:24:28
131
原创 leetcode199. 二叉树的右视图
1.题目描述:给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。2.层序遍历:也可普通的层序遍历结束之后对list集合进行操作得到右视图。3.递归,先访问右子树即可:...
2022-07-08 17:27:20
61
原创 leetcode107. 二叉树的层序遍历 II
1.题目描述:给你二叉树的根节点root,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 2.层序遍历:普通层序遍历再将集合反转。或: 3.递归,深度优先:...
2022-07-08 15:14:09
180
原创 leetcode102. 二叉树的层序遍历
1.题目描述:给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。2.层序遍历: 3.递归解法,深度优先:
2022-07-08 11:56:45
137
原创 leetcode347. 前 K 个高频元素
1.题目描述:给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。2.使用hashmap统计频次,再对value值进行排序(treeset只能对key排序),采用逆序取前k个值(需要完全遍历entryset排序),相当于大顶堆,时间复杂度O(nlogn)。class Solution { public int[] topKFrequent(int[] nums, int k) { Map<Integer, Inte
2022-05-21 14:59:08
242
原创 leetcode239. 滑动窗口最大值
1.题目描述:给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。2.暴力解法:超时。。class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int[] arr = new int[nums.length - k + 1]; for (int i =
2022-05-17 22:14:11
368
原创 leetcode150. 逆波兰表达式求值
1.题目描述:根据逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。注意两个整数之间的除法只保留整数部分。可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为0的情况。2.使用栈:遇到数字则入栈,遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中(leetcode内置的jdk版本判断字符串只能用equals)。class Solution { public int evalRPN.
2022-05-17 20:14:31
82
原创 leetcode1047. 删除字符串中的所有相邻重复项
1.题目描述:给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。2.使用栈:刚开始写的时候用了两个栈,用来入栈与出栈。。。class Solution { public String removeDuplicates(String s) { //借助两个栈 char[] arr = s.toCharArray()
2022-05-15 15:14:08
204
原创 leetcode20. 有效的括号
1.题目描述:给定一个只包括 '(',')','{','}','[',']' 的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合;左括号必须以正确的顺序闭合。2.使用栈:方法就是依次将左括号符号对应的右括号符号压入栈匹配则弹出,这题使用队列queue也可以,因为队列头元素与栈顶元素不一致。不匹配的情况一共有三种:①左括号有多②右括号有多③右括号不匹配。class Solution { public boolean isValid(String s
2022-05-15 11:52:19
229
原创 leetcode225. 用队列实现栈
1.题目描述:2.解法:与leetcode232. 用栈实现队列不同,无法用两个队列模仿出栈入栈,queue2用来存放从queue1弹出的元素,等queue1队列最末元素弹出后再将queue2存储的元素重新放回queue1。class MyStack { Queue<Integer> queue1 = new LinkedList<>(); Queue<Integer> queue2 = new LinkedList<>();
2022-05-14 17:23:36
114
原创 leetcode232. 用栈实现队列
1.题目描述:2.解法:(关键在于使用两个栈进行模拟)class MyQueue { Stack<Integer> stackIn = new Stack<>();//入栈操作 Stack<Integer> stackOut = new Stack<>();//出栈操作 public MyQueue() { } public void push(int x) { stackIn.
2022-05-14 13:55:25
173
1
原创 leetcode459. 重复的子字符串
1.题目描述:给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。2.暴力枚举:class Solution { public boolean repeatedSubstringPattern(String s) { int len = s.length(); for (int i = 0; i < len / 2; i++) { int con = len / (i + 1);
2022-05-14 12:07:12
523
原创 leetcode28. 实现 strStr()
1.题目描述:实现strStr()函数。给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串出现的第一个位置(下标从0开始)。如果不存在,则返回-1。2.KMP算法:就是实现String.indexOf(String str),时间复杂度O(m + n)。前缀表减一:class Solution { public int strStr(String haystack, String needle) { if (hay
2022-05-13 16:44:12
284
原创 leetcode剑指 Offer 58 - II. 左旋转字符串
1.题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。2.较易:class Solution { public String reverseLeftWords(String s, int n) { int len = s.length(); if (len <= n) return s
2022-05-12 16:49:04
133
原创 leetcode151. 颠倒字符串中的单词
1.题目描述:给你一个字符串s,颠倒字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。2.自己写的解法:双指针/结合栈,不少细节需要注意。class Solution { public String reverseWords(String s)
2022-05-12 14:41:46
384
原创 leetcode剑指 Offer 05. 替换空格
1.题目描述:请实现一个函数,把字符串s中的每个空格替换成"%20"。2.使用StringBuilder:也可直接returns.replace("","%20"),也有将字符串扩容,在最后使用双指针开始填充,感觉意义不大。class Solution { public String replaceSpace(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0;...
2022-05-12 11:12:40
144
原创 leetcode541. 反转字符串 II
1.题目描述:给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。如果剩余字符少于k个,则将剩余字符全部反转。如果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符保持原样。2.自己写的解法:从整体考虑需要反转字符串的位置,稍微有点复杂。class Solution { public String reverseStr(String s, int k) { StringBuilder sb = new Str
2022-05-11 23:43:40
88
原创 leetcode344. 反转字符串
1.题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。2.双指针:class Solution { public void reverseString(char[] s) { int left = 0; int right = s.length - 1; while (left < right) {
2022-05-11 22:19:50
158
原创 leetcode16. 最接近的三数之和
1.题目描述:给你一个长度为n的整数数组nums和一个目标值target。请你从nums中选出三个整数,使它们的和与target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。2.排序后双指针:与leetcode15. 三数之和类似,但是不需要去重,也可去重优化见leetcode题解。class Solution { public int threeSumClosest(int[] nums, int target) { int min = Integer
2022-05-11 00:00:43
216
原创 leetcode18. 四数之和
1.题目描述:给你一个由n个整数组成的数组nums,和一个目标值target。请你找出并返回满足下述全部条件且不重复的四元组[nums[a], nums[b], nums[c], nums[d]](若两个四元组元素一一对应,则认为两个四元组重复):0 <= a, b, c, d < n;a、b、c和d互不相同;nums[a] + nums[b] + nums[c] + nums[d] == target。你可以按任意顺序返回答案。2.排序后双指针:与leetcode15. 三数之和思
2022-05-10 21:14:42
116
原创 leetcode15. 三数之和
1.题目描述:给你一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得 a + b + c = 0 ?请你找出所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。2.排序后双指针:使用哈希去重较麻烦。class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> list
2022-05-10 19:50:15
171
原创 leetcode454. 四数相加 II
1.题目描述:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组 (i, j, k, l) 能满足:0 <= i, j, k, l < n;nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0。2.使用hashmap:nums1和nums2一组双层for循环遍历将和存入hashmap中,nums3和nums4一组双层for循环遍历,这种算法中包含重复项,也可以三一分组。class So
2022-05-10 14:50:22
169
原创 leetcode1. 两数之和
1.题目描述:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。2.暴力解法:class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++)
2022-05-10 12:00:09
162
原创 leetcode202. 快乐数
1.题目描述:编写一个算法来判断一个数n是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环但始终变不到1。如果这个过程结果为1,那么这个数就是快乐数。如果n是快乐数就返回true;不是,则返回false。2.使用hashset:若非快乐数则必有重复数字出现,使用hashset记录即可,取每个位置的数字方法需要注意。class Solution { public boolean isHa
2022-05-09 21:41:28
288
原创 leetcode350. 两个数组的交集 II
1.题目描述:给你两个整数数组nums1和nums2,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。2.使用hashmap:class Solution { public int[] intersect(int[] nums1, int[] nums2) { Map<Integer, Integer> map = new HashMap.
2022-05-09 21:16:36
360
原创 leetcode349. 两个数组的交集
1.题目描述:给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。2.使用hashset:class Solution { public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set1 = new HashSet<>(); Set<Integer> set2 = ne
2022-05-08 17:39:37
285
原创 leetcode438. 找到字符串中所有字母异位词
1.题目描述:给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。2. 基于leetcode242. 有效的字母异位词的暴力解法:class Solution { public List<Integer> findAnagrams(String s, String p) { if (s.length() < p.length()) retur
2022-05-08 17:04:26
409
原创 leetcode49. 字母异位词分组
1.题目描述:给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。2.字符串排序后作为哈希表的key值:class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String, List> map = new HashMa
2022-05-07 22:10:58
303
原创 leetcode383. 赎金信
1.题目描述:给你两个字符串:ransomNote和magazine,判断ransomNote能不能由magazine里面的字符构成。如果可以,返回true;否则返回false。magazine中的每个字符只能在ransomNote中使用一次。2.使用数组代替哈希表的功能:与leetcode242. 有效的字母异位词基本一样。class Solution { public boolean canConstruct(String ransomNote, String maga
2022-05-06 22:39:44
239
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人