笛子的刷题之路
文章平均质量分 68
记录下在LeetCode做题的过程和学到的东西
SOS团团员A
这个作者很懒,什么都没留下…
展开
-
ACM模式下的做题模板
这么安排的作用就是把输入输出的部分和算法实现的部分隔开,让我们在做题的时候能够还原核心算法模式下的习惯import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { int a = sc.nextInt();原创 2021-09-08 10:37:18 · 277 阅读 · 0 评论 -
构造最大二叉树,大无语事件发生
LeetCode 第654题 最大二叉树 做题记录题目描述我的解法思路更优解法对应Java代码题目描述我的解法思路本题与通过后序与中序构造二叉树的题目有些相似,只不过把递归通过两种顺序查找节点的过程变成了寻找数组最大值,不过不同的是构造二叉树可以通过构造HashMap降低寻找节点的时间,最大值则不行。但是用一开始时间复杂度为O(n)的算法只要稍加修改把查找中序中符合条件的节点变成查找最大值节点即可。递归三要素:返回值与参数:返回值为构造的新节点,参数有当前访问的参数,左或右子树数组终结条件原创 2021-04-11 12:20:29 · 51 阅读 · 0 评论 -
[二叉树路径总和] 一杯茶一包烟,一个递归转一天
LeetCode 第112题 路径总和 做题记录题目描述![在这里插入图片描述](https://img-blog.csdnimg.cn/20210409154915348.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzMyNjE2,size_16,color_FFFFFF,t_70)我的解法思路对应Java代码复杂度分析递归法的进原创 2021-04-09 15:50:57 · 205 阅读 · 0 评论 -
判断平衡二叉树的方法
LeetCode 第110题 平衡二叉树 做题记录题目描述我的解法思路修改后的对应Java代码复杂度分析迭代法思路题目描述我的解法思路先尝试用递归法解决确定参数和返回值返回值:true 或 false参数:因为要比较每个节点两个子树的高度,所以参数是左节点和右节点确定终止条件如果左右节点都为空 返回ture如果左、右节点只有一个为空,则判断另一个节点的左右子节点是都为空,若存在不为空的,返回false,否则返回treu确定单层的操作逻辑将当前节点的左右子节输入递归函数进行判原创 2021-04-08 11:00:16 · 191 阅读 · 0 评论 -
计算二叉树最小深度时容易忽略的情况
LeetCode 第111题 二叉树的最小深度 做题记录题目描述我的解法思路错误时的情况出错的Java代码修改后的Java代码(递归法)复杂度分析迭代法思路题目描述我的解法思路使用和求最大深度时类似的递归法,只不过将单层逻辑中的获取左右子树最大值变成过去左右子树最小值。但是出错了错误时的情况下图来源于公众号代码随想录出错的Java代码class Solution { public int minDepth(TreeNode root) { return getM原创 2021-04-07 11:23:01 · 79 阅读 · 0 评论 -
简单易懂地求二叉树的最大深度
LeetCode 第104题 二叉树的最大深度 做题记录题目描述我的解法思路——迭代法对应Java代码复杂度分析其他解法——递归法思路对应Java代码复杂度分析题目描述我的解法思路——迭代法想要获得最大深度需要对真整个树进行遍历,而最大深度等于层数嘛,那使用层序遍历并在遍历过程中统计深度即可。但是深度优先的前、中、后遍历感觉处理起来反而很麻烦。对应Java代码class Solution { public int maxDepth(TreeNode root) { /原创 2021-04-07 10:13:07 · 151 阅读 · 0 评论 -
使用递归法和迭代法进行对称二叉树判断
LeetCode 第101题 对称二叉树 做题记录题目描述我的解法思路更优解法思路对应Java代码4.7日更 迭代法--使用队列作为容器复杂度分析收获总结题目描述我的解法思路最直观的思路是进行层序遍历,将每一层的所有节点都放到一个数组中,当该层遍历完之后,利用数组A[i] == A[length - i -1]进行判断。过程中发现这种方法会开辟大量的空间,因为需要把很多没有节点的地方用null代替存储,并且只要要每层都遍历完才能进行一次判断,结果就是超过时间限制更优解法此部分转载于公众号代码随原创 2021-04-07 09:01:07 · 146 阅读 · 0 评论 -
翻转二叉树的若干种解法
LeetCode 第226题 翻转二叉树 做题记录题目描述我的解法思路层序遍历的迭代法对应Java代码复杂度分析收获总结后序遍历的递归法对应Java代码题目描述我的解法思路从结果来看,就是将每个节点的左右子节点互换了;方法上属于层序遍历,适合使用队列结构;具体实现,即使用基础的层序遍历方法,不过有两点区别:将子节点加入队列时调整下顺序,先加入右节点,再加入左节点;添加成功后才将当前节点弹出,因为要对当前节点的左右节点进行更改以上的思路关键的地方在于:需要对每个节点的左右子节点进行修改原创 2021-04-06 10:53:09 · 55 阅读 · 0 评论 -
102、107、199、637、429 二叉树层序遍历
102、107、199、637、429 二叉树层序遍历层序遍历算法说明题目介绍对应JAVA代码层序遍历算法说明前、中、后序遍历是深度优先遍历的一种,符合先进后出的特点,用栈结构来实现;层序遍历是广度优先遍历的一种,符合先进先出的特点,用队列结构来实现;所以基础的层序遍历就是在将根节点加入队列后,在对队列进行遍历的过程中,将当前节点的左节点、右节点加入队列,直到队列为空的过程。复杂一些的问题,就是在遍历过程中需要统计各个层级的信息,这时候需要以当前队列的长度作为层的节点数进行遍历(即以一层一层的方式原创 2021-04-06 10:09:14 · 90 阅读 · 0 评论 -
144、94、145 迭代法统一写法 + 二叉树前中后序遍历
144 递归 + 中序遍历题目描述算法思路说明为了解决遍历顺序和处理顺序不一致的问题,将遍历过但是暂不处理的打上标记,碰到带标记的则将标记与节点本身出栈对应JAVA代码class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<Integer>(); Deque原创 2021-04-06 09:41:10 · 62 阅读 · 0 评论 -
迭代法 + 二叉树前、中、后序遍历
LeetCode 迭代法 + 二叉树前、中、后序遍历做题记录144 递归+前序遍历题目描述我的解法对应Java代码复杂度分析94 递归+中序遍历题目描述我的解法对应Java代码复杂度分析145 递归+后序遍历题目描述我的解法对应Java代码复杂度分析收获总结144 递归+前序遍历题目描述我的解法对应Java代码class Solution { public List<Integer> preorderTraversal(TreeNode root) { Lis原创 2021-04-02 15:42:15 · 268 阅读 · 0 评论 -
LeetCode 递归法 + 二叉树前、中、后序遍历
LeetCode 递归法 + 二叉树前、中、后序遍历做题记录144 递归+前序遍历题目描述我的解法对应Java代码复杂度分析94 递归+中序遍历题目描述我的解法对应Java代码复杂度分析145 递归+后序遍历题目描述我的解法对应Java代码复杂度分析收获总结递归算法的三个要素144 递归+前序遍历题目描述我的解法对应Java代码class Solution { List<Integer> result = new ArrayList<Integer>();原创 2021-04-02 10:59:45 · 49 阅读 · 0 评论 -
LeetCode 第225题 用队列实现栈 做题记录
LeetCode 第225题 用队列实现栈 做题记录题目描述我的解法思路对应Java代码复杂度分析更优解法思路对应Java代码复杂度分析收获总结题目描述我的解法思路将一个队列作为备份,栈的pop和top操作需要取尾部元素时,将一个队列里的元素转移到另一个中,转移中的最后一个元素即为所需,处理完再转移回来对应Java代码class MyStack { private Queue<Integer> qu1,qu2; /** Initialize your data st原创 2021-03-30 09:47:30 · 65 阅读 · 0 评论 -
LeetCode 第28题 实现strStr() - KMP算法实现
@[TOC](LeetCode 第28题 实现strStr() 做题记录)题目描述我的解法思路最直接的方法——暴力求解两层循环,时间复杂度O(mn) m和n分别是两个字符串的长度上面超出时间限制了,那就不得不用KMP算法了对应Java代码执行时超出了时间限制class Solution { public int strStr(String haystack, String needle) { if(needle == null || needle.length(原创 2021-03-25 16:58:18 · 82 阅读 · 0 评论 -
LeetCode 剑指Offer 58 - 2 左旋转字符串 做题记录
LeetCode 剑指Offer 58 - 2 左旋转字符串 做题记录题目描述我的解法思路对应Java代码复杂度分析更优解法思路对应Java代码复杂度分析收获总结题目描述我的解法思路使用StringBuilder,先将n~ str.length这部分的字符串加入,再将0~n-1这部分的字符串加入对应Java代码class Solution { public String reverseLeftWords(String s, int n) { StringBuilder原创 2021-03-22 15:09:13 · 71 阅读 · 0 评论 -
LeetCode 剑指offer 第5题 替换空格 做题记录
LeetCode 剑指offer 第5题 替换空格 做题记录题目描述我的解法思路对应Java代码![在这里插入图片描述](https://img-blog.csdnimg.cn/20210322150252819.png)复杂度分析更优解法思路(适用于C++,不适用于Java)C++与Java此题解法的不同题目描述我的解法思路将字符串转化成字符数组,遍历进行替换,然后再转化回字符串但是在尝试中发现,被替换后的“%20”并不是单个字符那就一边遍历字符串一边构造字符数组但是数组需要提前指定长度,原创 2021-03-22 15:03:46 · 86 阅读 · 0 评论 -
LeetCode 第344题 反转字符串 做题记录
LeetCode 第344题 反转字符串 做题记录题目描述我的解法思路对应Java代码复杂度分析题目描述我的解法思路很简单,遍历数组,将索引 i 和索引 length-1-i的 互换,要注意的是遍历的中间元素边界选择是什么 (length / 2 )- 1 闭区间对应Java代码class Solution { public void reverseString(char[] s) { char tmp; for(int i = 0; i <=原创 2021-03-16 11:31:54 · 56 阅读 · 0 评论 -
LeetCode 第541题 反转字符串2 做题记录
LeetCode 第541题 反转字符串2 做题记录题目描述我的解法思路对应Java代码题目描述我的解法思路这和普通反转需要注意的不过就是添加是否需要反转的判定,另外反转时的索引标号的格式更麻烦一些。另一个小的点就是字符串与字符数组间的相互转化对应Java代码class Solution { public String reverseStr(String s, int k) { char[] c = s.toCharArray(); int epoch原创 2021-03-16 11:29:55 · 49 阅读 · 0 评论 -
LeetCode 第18题 四数之和 做题记录
LeetCode 第18题 四数之和 做题记录题目描述我的解法思路对应Java代码复杂度分析题目描述我的解法思路思路和用双指针法解决三数之和是一样的,但是具体的去重操作不同。对应Java代码class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> result = new ArrayLi原创 2021-03-15 13:41:49 · 57 阅读 · 0 评论 -
LeetCode 第15题 三数之和 做题记录
LeetCode 第15题 三数之和 做题记录题目描述我的解法思路更优解法思路对应Java代码收获总结题目描述我的解法思路暴力破解,时间复杂度是O(n³)和前面的两数之和做对比,区别一是只提供了一个数组,和两个独立的数组相比就要求相同索引的元素不能使用两次;二提供数值的三元组而不是索引,也就是输出的时候可以不知道索引和之前的四数之和做对比,区别除了只提供了一个数组外,四数之和只要求输出满足条件的组合数目,而不要求具体值。从输出内容来看,三数之和为了两数和四数之间,可以尝试从这个区别切入。因原创 2021-03-15 11:12:19 · 67 阅读 · 0 评论 -
LeetCode 第383题 赎金信 做题记录
LeetCode 第383题 赎金信 做题记录题目描述我的解法思路过程中的错误调试对应Java代码复杂度分析更优解法思路对应Java代码收获总结题目描述我的解法思路这道题看起来和之前的242题 有效的字母异位题相似,只不过之前的题要求两个字符串所有字母数字数量相等,这个就要求后面字符串B中对于前一个字符串A中有的字符数量要大于等于A。那么简单的做法也相近,建立一个长度26的数组,遍历A,在对应字母位置加1,再遍历B,对应字母位置-1,只要A中有的字母对应数值小于等于0即为true,否则相反。不过这原创 2021-03-13 20:57:34 · 101 阅读 · 0 评论 -
LeetCode 第454题 四数相加2 做题记录
LeetCode 第454题 四数相加2 做题记录题目描述我的解法思路对应Java代码复杂度分析收获总结题目描述我的解法思路最直接的暴力求解有四层嵌套循环,遂不考虑;而联想到之前做的第1题两数之和中采用的HashMap结构而1中使用HashMap结构相当于只能包含两个数组的信息,所以就想到了先对A和B的和构建哈希表(相当于把A和B作为一个整体),Key值为两数组元素的和,Value为和的值出现的次数,然后与C和D的和进行比较(把C和D作为整体)对应Java代码错误提示:因为像在python原创 2021-03-12 15:33:28 · 70 阅读 · 0 评论 -
LeetCode 第1题 两数之和 做题记录
LeetCode 第1题 两数之和 做题记录题目描述我的解法思路对应Java代码复杂度分析更优解法思路对应Java代码复杂度分析收获总结题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。我的解法思路作为题库中的第一题,最直接的方法就是两层循环遍历,寻找符合的坐标思考下这题虽然也是两个整数,但快慢指针并不合原创 2021-03-12 11:55:42 · 76 阅读 · 0 评论 -
LeetCode 第202题 快乐数 做题记录
LeetCode 第202题 快乐数 做题记录题目描述我的解法思路更优解法思路个人小结对应Java代码复杂度分析题目描述编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。我的解法思路循环与终止条件怎么设置?因为按照题干中的流程会出现无限循环的情况【没有想出来,不过这条规律应该需要推理才能获取,原创 2021-03-12 11:51:55 · 129 阅读 · 0 评论 -
LeetCode 第394题 两个数组的交集 做题记录
LeetCode 第394题 两个数组的交集 做题记录题目描述我的解法思路更优解法思路对应Java代码复杂度分析收获总结题目描述给定两个数组,编写一个函数来计算它们的交集。示例 1 :输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]我的解法思路设置一个长度为10的数组a,存储数组nums1中是否有0-9,有的话将其置1,然后再遍历nums2,a中等于1且对应位置设为为2,最后输出数组a中等于2的索引报错:原来数组里并不是只有0-9的数字,那这种方法显原创 2021-03-12 11:49:55 · 124 阅读 · 0 评论 -
LeetCode 第242题 有效的字母异位词 做题记录
LeetCode 第242题 有效的字母异位词 做题记录题目描述我的解法思路对应Java代码复杂度分析进阶问题官方说明对应Java代码题目描述给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false说明:你可以假设字符原创 2021-03-12 11:47:42 · 94 阅读 · 0 评论 -
LeetCode 第142题 环形链表2 做题记录
LeetCode 第142题 环形链表2 做题记录题目描述我的解法思路更优解法思路对应Java代码复杂度分析题目描述我的解法思路要识别环就要识别出哪些节点是会被重复遍历的,找到第一次被重复遍历的节点就是本题的答案,因此需要对已经遍历过的节点进行标记,在循环过程中进行判定,但是节点属性里并不能添加标识位,而且因为链表的特性当前节点只能获取其后面的值,前面遍历过的就被遗忘了。到这里,联想到了额外设置一个指针用于指向前面被遍历过的节点,于是获得了解题思路。设置一个初始指针1,指向第一个节点,然后从这原创 2021-03-09 11:50:57 · 91 阅读 · 0 评论 -
LeetCode 第206题 反转链表 做题记录
LeetCode 第206题 反转链表 做题记录题目描述我的解法思路编码过程中出现的问题对应Java代码复杂度分析更优解法思路对应Java代码复杂度分析另一种方法对应Java代码收获总结题目描述反转一个单链表示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?我的解法思路最直接的想法是定义一个新的链表,对原链表进行遍历找原创 2021-03-09 11:49:48 · 94 阅读 · 0 评论 -
LeetCode 第707题 设计链表 做题记录
LeetCode 第707题 设计链表 做题记录题目描述我的解法思路过程中的错误记录对应Java代码小结更优解法思路对应Java代码题目描述设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点原创 2021-03-08 15:52:20 · 108 阅读 · 0 评论 -
LeetCode 第203题 移除链表元素 做题记录
LeetCode 第203题 移除链表元素 做题记录题目描述我的解法思路更优解法思路一般解法(直接使用原来的链表来进行删除操作)对应Java代码较优解法(创建一个虚拟头结点)对应Java代码复杂度分析收获总结单链表遍历的一般写法题目描述我的解法思路这道题也不涉及到什么思路,就是一般的链表遍历和删除。但是。。。就是链表遍历的过程和条件判定总是出问题,居然写了两个小时,还是没有通过。所以代码就不放了,最后面总结一下最基础的链表遍历写法吧更优解法此部分转载于公众号代码随想录思路一般解法(直接使用原创 2021-03-08 12:45:45 · 80 阅读 · 0 评论 -
数组部分知识方法总结
代码随想录这篇总结很全面,前面做的几道题也是跟着大佬的思路过来的。这里我只记录这篇总结中强调的点:数组理论基础数组是存放在连续内存空间上的相同类型数据的集合。需要注意的两点:数组下标都是从0开始的。数组内存空间的地址是连续的二维数组在内存的空间地址也不是连续的 上述二维数据在内存中不是 3*4 的连续地址空间,而是四条连续的地址空间组成!(前面竖着的还有一条)数组的经典题目1、二分法https://blog.csdn.net/qq_34332616/article/deta原创 2021-03-08 12:44:46 · 75 阅读 · 0 评论 -
LeetCode 第59题 螺旋矩阵2 做题记录
LeetCode 第59题 螺旋矩阵2 做题记录题目描述我的解法思路对应Java代码复杂度分析更优解法思路对应Java代码复杂度分析收获总结题目描述我的解法思路以矩阵中的元素个数作为遍历条件,根据螺旋的规律,每次循环中修改行、列对应的索引值,难点在于后一句,可以确定的是,这不想是按照一行一行的顺序,常规的两个循环是不行的,那么使用判断语句,交替继续行列看起来是可行的。对应Java代码class Solution { public int[][] generateMatrix(int n)原创 2021-03-07 12:15:15 · 89 阅读 · 0 评论 -
LeetCode 第209题 长度最小的子数组 做题记录
LeetCode 第209题 长度最小的子数组 做题记录题目描述我的解法思路对应Java代码复杂度分析更优解法思路对应Java代码复杂度分析更直观的暴力解法对应Java代码收获总结题目描述给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target原创 2021-03-07 10:46:34 · 116 阅读 · 0 评论 -
LeetCode 第27题 移除元素 做题记录
LeetCode 第27题 移除元素 做题记录题目描述我的解法思路对应Java代码复杂度分析更优解法思路对应Java代码复杂度分析收获总结题目描述给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:输入:nums = [3,2,2,3], val = 3输出:2, nums = [2原创 2021-03-06 16:42:04 · 135 阅读 · 0 评论 -
LeetCode 第35题 搜索插入位置 做题记录
LeetCode 第35题 搜索插入位置 做题记录题目描述我的解法思路对应Java代码复杂度分析更优的解法思路对应Java代码复杂度分析收获总结题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5原创 2021-03-06 13:44:57 · 95 阅读 · 0 评论