LeetCode
记录LeetCode刷题过程中的一些笔记
小毛激励我好好学习
这个作者很懒,什么都没留下…
展开
-
LeetCode-Tree篇总结
文章目录一、前言二、基础1. 树节点的定义。2. 深度优先遍历的递归写法3. 深度优先遍历的迭代写法4. 广度优先遍历的迭代写法三、深度优先遍历1. 树的深度问题2. 树的路径或叶子节点问题3. 二叉搜索树或中序遍历问题四、广度优先遍历问题一、前言作为正式好好刷题的开始,考虑到树相关的题目一般而言较为模板化,递归的代码一般也比较简洁,而且个人也比较擅长这个方面,因此,决定先从这个部分开始。这篇博客主要是记录一些思路,并不会讲解太多题目。二、基础个人认为,树的大部分题目其实都可以归结为一个遍历问题,树原创 2020-10-10 11:44:54 · 380 阅读 · 0 评论 -
121. 买卖股票的最佳时机
题目描述:给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出...原创 2020-06-10 11:27:28 · 105 阅读 · 0 评论 -
面试题46. 把数字翻译成字符串
题目描述:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"提示:0 <= num < 231个人思路:这道题关键点在于对于..原创 2020-06-09 11:13:08 · 190 阅读 · 0 评论 -
213. 打家劫舍 II
题目描述:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例1:输入: [2,3,2]输出: 3解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的.原创 2020-06-08 11:33:40 · 86 阅读 · 0 评论 -
198. 打家劫舍
题目描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。...原创 2020-06-08 10:57:48 · 124 阅读 · 0 评论 -
面试题 08.01. 三步问题
题目描述:三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。示例1:输入:n = 3输出:4说明: 有四种走法示例2:输入:n = 5输出:13提示:n范围在[1, 1000000]之间个人思路:爬楼梯问题,经典的动态规划问题,所以还是套用动态规划的模板即可。状态定义:dp[i]表示到达阶梯i的走法个数。但通过转移方程的分析,我们不难...原创 2020-06-08 10:40:57 · 254 阅读 · 0 评论 -
70. 爬楼梯
题目描述:假设你正在爬楼梯。需要 n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶个人思路:这就是一道非常经典的动态规划的题目了。对...原创 2020-06-07 11:09:40 · 97 阅读 · 0 评论 -
面试题42. 连续子数组的最大和
题目描述:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。提示:1 <=arr.length <= 10^5-100 <= arr[i] <= 100注意:本题与主站 53 题相同:https://leetcode-cn....原创 2020-06-06 14:50:50 · 128 阅读 · 0 评论 -
655. 输出二叉树
题目描述:在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:行数m应当等于给定二叉树的高度。列数n应当总是奇数。根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,但仍需要为另一个子树留出足够的空间。然而,如果两个子树都为空则不需要为它们留出任何空间。每个未...原创 2020-06-03 16:40:54 · 126 阅读 · 0 评论 -
654. 最大二叉树
题目描述:给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。示例 :输入:[3,2,1,6,0,5]输出:返回下面这棵树的根节点: 6 / \ 3 5 \ / 2 0 \ 1...原创 2020-06-03 13:50:51 · 92 阅读 · 0 评论 -
114. 二叉树展开为链表
题目描述:给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树 1 / \ 2 5/ \ \3 4 6将其展开为:1\ 2 \ 3 \ 4 \ 5 \ 6个人思路:还是优先考虑使用递归来完成。递归的核心在于:在递归主体只对root节点进行相应的处理,剩下来的操作通过递归调用左右孩子节点来完成。本题需要将二叉树转化为一个链表,也就...原创 2020-06-03 13:37:06 · 103 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树
题目描述:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / /-10 5个人思路:emmm,还是递归吧!遵循一个原则:在递归主体中只处理root,剩下来的交...原创 2020-06-03 11:37:19 · 99 阅读 · 0 评论 -
104. 二叉树的最大深度
题目描述:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度3 。个人思路:遇“树”不决,先递归!个人的主要思路是通过递归去寻找叶子结点。当遇到叶子结点时,尝试去更新目前最大深度;不是叶子结点时,再去查找它的左右孩子。关键点是需要维护一个类的...原创 2020-06-03 11:22:33 · 142 阅读 · 0 评论 -
700. 二叉搜索树中的搜索
题目描述:给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和值: 2你应该返回如下子树: 2 / \ 1 3在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。个人思路:这...原创 2020-06-02 12:16:50 · 106 阅读 · 0 评论 -
96. 不同的二叉搜索树
题目描述:给定一个整数 n,求以1 ...n为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 ...原创 2020-06-02 11:32:06 · 168 阅读 · 0 评论 -
面试题68 - I. 二叉搜索树的最近公共祖先
题目描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5] ...原创 2020-06-02 10:23:35 · 142 阅读 · 0 评论 -
144. 二叉树的前序遍历
题目描述:给定一个二叉树,返回它的前序遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,2,3]进阶:递归算法很简单,你可以通过迭代算法完成吗?个人思路:递归算法很简单,按照顺序D->L->R即可,还是一个原则,只对root节点进行处理,这里是将节点值添加至输出列表中。迭代算法与94. 二叉树的中序遍历类似,只需要注意添加node.val的位置,改为先处理根节点了。具体代码如下:...原创 2020-06-01 15:07:14 · 147 阅读 · 0 评论 -
94. 二叉树的中序遍历
题目描述:给定一个二叉树,返回它的中序遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,3,2]进阶:递归算法很简单,你可以通过迭代算法完成吗?个人思路:中序遍历的递归算法很简单,就按照L->D->R的顺序完成即可。二叉树递归算法需要考虑的主要是root节点处应该如何处理,左右子树递归调用即可。迭代算法的话,需要使用栈结构。通过不断查找左子树,并保存当前所经历的节点,可以查找到最左侧的节点,该节点...原创 2020-06-01 13:01:42 · 113 阅读 · 0 评论 -
145. 二叉树的后序遍历
题目描述:给定一个二叉树,返回它的 后序遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [3,2,1]进阶:递归算法很简单,你可以通过迭代算法完成吗?个人思路:这道题和590. N叉树的后序遍历思路基本一致,不同之处在于N叉树会提供当前节点的所有孩子节点,而二叉树则是通过左孩子和右孩子指针给出。还是一样,只需要注意以下两点即可:孩子节点之间需要按照从左到右的自然顺序完成遍历 父亲节点要晚于所有孩子节点完成...原创 2020-06-01 12:06:35 · 147 阅读 · 0 评论 -
590. N叉树的后序遍历
题目描述:给定一个 N 叉树,返回其节点值的后序遍历。例如,给定一个3叉树:返回其后序遍历: [5,6,3,2,4,1].说明:递归法很简单,你可以使用迭代法完成此题吗?个人思路:emmm,虽然是道简单题,但是还是吭哧吭哧写了好久,对递归还是太不熟练了。这道题是关于N叉树的,比较少见,树节点的定义如下:class Node: def __init__(self, val=None, children=None): self.val =...原创 2020-06-01 11:11:55 · 150 阅读 · 0 评论 -
1431. 拥有最多糖果的孩子
题目描述:给你一个数组candies和一个整数extraCandies,其中candies[i]代表第 i 个孩子拥有的糖果数目。对每一个孩子,检查是否存在一种方案,将额外的extraCandies个糖果分配给孩子们之后,此孩子有 最多的糖果。注意,允许有多个孩子同时拥有 最多的糖果数目。示例 1:输入:candies = [2,3,5,1,3], extraCandies = 3输出:[true,true,true,false,true]解释:孩子 1 有 2 ...原创 2020-06-01 09:51:36 · 277 阅读 · 0 评论 -
107. 二叉树的层次遍历 II
题目描述:给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[ [15,7], [9,20], [3]]个人思路:整体思路同102. 二叉树的层序遍历,只不过在添加结果时使用insert操作进行反向添加。具体代码如下:class So...原创 2020-05-29 14:20:07 · 120 阅读 · 0 评论 -
102. 二叉树的层序遍历
题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]个人思路:这道题目明确要求使用层序遍历,按从左到右访问节点,根据输出提示来看,需要保存每一层的访问结果。我的思路就是:使用列表来保存每一层的非None的节点,然后利...原创 2020-05-29 12:02:54 · 135 阅读 · 0 评论