LeetCode 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
进阶:递归算法很简单,你可以通过迭代算法完成吗?
思路就是二叉树的层序遍历
实现1234567891011121314151617181920212223class Solution { public List<Integer> preorderTraversal(TreeNode root) { if (root == null){ return new ArrayList<>( ...
LeetCode 148. 排序链表
148. 排序链表题目给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例 1:
输入:head = [4,2,1,3]输出:[1,2,3,4]示例 2:
输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]示例 3:
输入:head = []输出:[]
提示:
链表中节点的数目在范围 [0, 5 * 104] 内-105 <= Node.val <= 105
思路先对链表进行拆分,然后链表逐个合并(合并两个有序链表),类似第23题合并k个升序链表
实现1
LeetCode 15. 三数之和
15. 三数之和题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
12输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]
示例 2:
12输入:nums = []输出:[]
示例 3:
12输入:nums = [0]输出:[]
123提示:0 <= nums.length <= 3000-105 <= nums[i] <= 105
思路本题的难点在于去除重复的元素,这个题类似于全排列II、子集II都是需要排序后去重
第一种:三种for循环暴力求解
第二种:for循环的时间复杂度太高,在O(n^3^),优化后使用两次for循环,在第三次的时候我们使用两个指针来代替(因为我们已经使用了排序,所以才能使用指针)
先对数组进行排序
第一层为for循环,第二层为while循环(left < right)
要排除重复元素,如果这个值和前 ...
LeetCode 124. 二叉树中的最大路径和
124. 二叉树中的最大路径和题目路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例 1:
输入:root = [1,2,3]输出:6解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6示例 2:
输入:root = [-10,9,20,null,null,15,7]输出:42解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
提示:
树中节点数目范围是 [1, 3 * 104]-1000 <= Node.val <= 1000
思路实现
LeetCode 141. 环形链表
141. 环形链表题目给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
示例 1:
123输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
123输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
123输入:head = [1], pos = -1输出:false解释:链表中没有环。
提示:
链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。
思路快慢指 ...
LeetCode 1. 两数之和
1. 两数之和题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
12输入:nums = [3,2,4], target = 6输出:[1,2]
示例 3:
12输入:nums = [3,3], target = 6输出:[0,1]
提示:
12342 <= nums.length <= 104-109 <= nums[i] <= 109-109 <= target <= 109只会存在一个有效答案
思路第一个就是双重for循环
第二个就是我们使用一个map存储访问过的数据,第二个target-num[i] ,如果map中有这个数据,说 ...
无题
103. 二叉树的锯齿形层序遍历
LeetCode 105. 从前序与中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树题目给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]示例 2:
Input: preorder = [-1], inorder = [-1]Output: [-1]
提示:
1 <= preorder.length <= 3000inorder.length == preorder.length-3000 <= preorder[i], inorder[i] <= 3000preorder 和 inorder 均无重复元素inorder 均出现在 preorderpreorder 保证为二叉树的前序遍历序列inorder 保证为二叉树的中序遍历序列
思路先根据先序遍历结果能拿到根节点,然后在中序遍历结果中寻找根节点的位置,中序遍历中根节点之前的数据都是左子树,根节点右边的数据都是右子树, ...
LeetCode 102. 二叉树的层序遍历
102. 二叉树的层序遍历题目1234567891011121314151617181920给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]
思路这个就是树的广度优先遍历,我们需要借助一个队列来保存我们的广度的节点,以便第一个节点访问过后,能够直接访问广度节点而不是再次回溯
实现时间复杂度:O(N)
空间复杂度:O(N)
12345678910111213141516171819202122232425262728293031323334private static class Solution { public List<List<Integer>> levelOrder(TreeNode root) { //记录最后的收集结果 List<List< ...
LeetCode 112. 路径总和
112. 路径总和题目给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
示例 1:
12输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true
示例 2:
12输入:root = [1,2,3], targetSum = 5输出:false
示例 3:
12输入:root = [1,2], targetSum = 0输出:false
提示:
123树中节点的数目在范围 [0, 5000] 内-1000 <= Node.val <= 1000-1000 <= targetSum <= 1000
思路实现