144. 二叉树的前序遍历(简单)
144. 二叉树的前序遍历(简单)给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1:输入:root = [1,null,2,3]输出:[1,2,3]
示例 2:输入:root = []输出:[]
示例 3:输入:root = [1]输出:[1]
示例 4:输入:root = [1,2]输出:[1,2]
示例 5:输入:root = [1,null,2]输出:[1,2]
提示:树中节点数目在范围 [0, 100] 内-100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
思路1:递归
思路2:迭代
代码1:123456789101112class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> pre ...
146. LRU 缓存机制(困难)
146. LRU 缓存机制(困难)运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:
LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?
示例:1234567891011121314151617输入["LRUCache", "put", "put", "get", "put", "get", "put", "get", " ...
1047. 删除字符串中的所有相邻重复项(简单)
1047. 删除字符串中的所有相邻重复项(简单)给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:输入:"abbaca"输出:"ca"解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
提示:1 <= S.length <= 20000S 仅由小写英文字母组成。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string
思路1:栈
代码1:12345678910111213141516171819class Solution { public String ...
108. 将有序数组转换为二叉搜索树(简单)
108. 将有序数组转换为二叉搜索树(简单)给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
123输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
123输入:nums = [1,3]输出:[3,1]解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:1 <= nums.length <= 104-104 <= nums[i] <= 104nums 按 严格递增 顺序排列
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
思路1:递归思路
代码1:12345678910111213141516171 ...
103. 二叉树的锯齿形层序遍历(简单)
103. 二叉树的锯齿形层序遍历(简单)给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
12345[ [3], [20,9], [15,7]]
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
思路:二叉树的层次遍历
代码:12345678910111213141516171819202122232425262728293031323334353637383940class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<Li ...
107. 二叉树的层序遍历 II(简单)
107. 二叉树的层序遍历 II(简单)给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层序遍历为:
12345[ [15,7], [9,20], [3]]
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
思路1:常规BFS
代码1:12345678910111213141516171819202122232425262728293031class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> res = ...
125. 验证回文串(一般)
125. 验证回文串(一般)给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:输入: "A man, a plan, a canal: Panama"输出: true
示例 2:输入: "race a car"输出: false
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-palindrome
思路:双指针
代码:1234567891011121314151617181920212223242526class Solution { public boolean isPalindrome(String s) { //双指针 if(s.length()==0){ return true; } int low = 0,high = s.length()-1; ...
341. 扁平化嵌套列表迭代器(一般)
341. 扁平化嵌套列表迭代器(一般)给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。
列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。
示例 1:123输入: [[1,1],2,[1,1]]输出: [1,1,2,1,1]解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。
示例 2:123输入: [1,[4,[6]]]输出: [1,4,6]解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,4,6]。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/flatten-nested-list-iterator
思路:多叉树遍历框架
代码:123456789101112131415161718192021222324252627282930313233public class NestedIterator imple ...
123. 买卖股票的最佳时机 III(困难)
123. 买卖股票的最佳时机 III(困难)给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:1234输入:prices = [3,3,5,0,0,3,1,4]输出:6解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。 随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。
示例 2:12345输入:prices = [1,2,3,4,5]输出:4解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 ...
121. 买卖股票的最佳时机(简单)
121. 买卖股票的最佳时机(简单)给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:1234输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:123输入:prices = [7,6,4,3,1]输出:0解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:1 <= prices.length <= 1050 <= prices[i] <= 104
来源:力扣(LeetCode)链接:https:// ...