我的LeetCode题解

74.搜索二维矩阵(矩阵)(medium)

给你一个满足下述两条属性的 m x n 整数矩阵:

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false

示例 1:

img

示例 2:

img

提示:

 

解答

 

 

20.有效的括号(栈)(easy)

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([])"

输出:true

提示:

 

解答

 

 

121.买卖股票的最佳时机(贪心算法)(easy)

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0

示例 1:

示例 2:

提示:

 

解答

 

 

70.爬楼梯(动态规划)(easy)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

示例 2:

提示:

解答

 

 

136.只出现一次的数字(技巧)(easy)

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

输入:nums = [2,2,1]

输出:1

示例 2 :

输入:nums = [4,1,2,1,2]

输出:4

示例 3 :

输入:nums = [1]

输出:1

提示:

 

解答

 

 

98.验证二叉搜索树(二叉树)(medium)

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

示例 1:

img

示例 2:

img

提示:

 

解答

 

 

94.二叉树的中序遍历(二叉树)(easy)

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

示例 1:

img

示例 2:

示例 3:

提示:

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

 

解答

 

 

104.二叉树的最大深度(二叉树)(easy)

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

img

示例 2:

提示:

 

解答

 

 

102.二叉树的层序遍历(二叉树)(medium)

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

img

示例 2:

示例 3:

提示:

 

解答

 

 

1.两数之和(哈希)(easy)

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

示例 2:

示例 3:

提示:

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

 

解答

 

 

128.最长连续序列(哈希)(medium)

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

示例 2:

示例 3:

提示:

 

解答:

核心思路:对于nums中的元素x,以x为起点,不断查找下一个数x+1,x+2,⋯是否在nums中,并统计序列的长度。

为了做到O(n)的时间复杂度,需要两个关键优化:

把nums中的数都放入一个哈希集合中,这样可以O(1)判断数字是否在nums中。如果x−1在哈希集合中,则不以x为起点。为什么呢?因为以x−1为起点计算出的序列长度,一定比以x为起点计算出的序列长度要长!这样可以避免大量重复计算。比如nums=[3,2,4,5],从3开始,我们可以找到3,4,5这个连续序列;而从2开始,我们可以找到2,3,4,5这个连续序列,一定比从3开始的序列更长。 ⚠注意:遍历元素的时候,要遍历哈希集合,而不是nums!如果nums=[1,1,1,…,1,2,3,4,5,…](前一半都是1),遍历nums的做法会导致每个1都跑一个O(n)的循环,总的循环次数是O(n^2),会超时。

 

哈希做法:

非哈希做法: