复原 IP 地址
题目描述
题目链接:93. 复原 IP 地址
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:”0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、”192.168.1.312” 和 “192.168@1.1“ 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例1:
12输入:s = "25525511135"输出:["255.255.11.135","255.255.111.35"]
示例2:
12输入:s = "0000"输出:["0.0.0.0"]
实例 ...
重排链表
题目描述
题目链接:143. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
1L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
1L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例1:
12输入:head = [1,2,3,4]输出:[1,4,2,3]
示例2:
12输入:head = [1,2,3,4,5]输出:[1,5,2,4,3]
提示:
链表的长度范围为 [1, 5 * 10(4)]
1 <= node.val <= 1000
我的题解方法一:双端队列思路很明显的思路,先遍历一遍,放入双端队列中,然后从两边取节点重组链表。
代码123456789101112131415161718class Solution { public void reorderList(ListNode head) { ArrayDeque<ListNode> queue = ...
二叉树中的最大路径和
题目描述
题目链接:124. 二叉树中的最大路径和
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例1:
123输入:root = [1,2,3]输出:6解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例2:
123输入:root = [-10,9,20,null,null,15,7]输出:42解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
提示:
树中节点数目范围是 [1, 3 * 10(4)]
-1000 <= Node.val <= 1000
我的题解方法一:递归思路由题意可知,最大路径的组成可能为:
根节点+左子树+右子树
根节点+左子树
根节点+右子树
根节点
左子树
右子树
因此我们应该考虑根节点是否选择的问题,递归返回值 ...
相交链表
题目描述
题目链接:160. 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
listA - 第一个链表
listB - 第二个链表
skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数
评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
示例1:
123456= 2, skipB = 3输出:Intersected at '8'解释:相交节点的值为 8 (注意,如果两个链 ...
全排列
题目描述
题目链接:46. 全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例1:
12输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例2:
12输入:nums = [0,1]输出:[[0,1],[1,0]]
示例3:
12输入:nums = [1]输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同
我的题解方法一:回溯法思路非常经典的递归题目,对于nums = [1,2,3],我们很容易想到:
先选取第一个数1,再选取第二个数2,最后选取3,得到一个答案1,2,3,加入答案数组;然后回溯上一个操作,不选3,不选2,选3,再选2,我们得到了另一个答案[1,3,2]。
因此我们需要一个标记数组标记当前数字是否已被选择,当得到一个答案之后回溯上一个选择即可。
代码12345678910111213 ...
二叉树的锯齿形层序遍历
题目描述
题目链接:103. 二叉树的锯齿形层序遍历
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例1:
12输入:root = [3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]
示例2:
12输入:root = [1]输出:[[1]]
示例3:
12输入:root = []输出:[]
提示:
树中节点数目在范围 [0, 2000] 内
-100 <= Node.val <= 100
我的题解方法一:层序遍历思路普通层序遍历即可,注意单数层顺序添加元素,双数层逆向添加元素即可
代码1234567891011121314151617181920212223242526272829class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { if (root == nu ...
二叉树的最近公共祖先
题目描述
题目链接:236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例1:
123输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
示例2:
123输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4输出:5解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
示例3:
12输入:root = [1,2], p = 1, q = 2输出:1
提示:
树中节点数目在范围 [2, 105] 内。
-109 <= Node.val <= 109
所有 Node.val 互不相同 。
p ! ...
合并两个有序数组
题目描述
题目链接:88. 合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例1:
1234输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]解释:需要合并 [1,2,3] 和 [2,5,6] 。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
示例2:
1234输入:nums1 = [1], m = 1, nums2 = [], n = 0输出:[1]解释:需要合并 [1] 和 [] 。合并结果是 [1] 。
示例3:
123 ...
环形链表
题目描述
题目链接:141. 环形链表
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意: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, 10(4)]
-10(5) <= Node.val <= 10(5)
pos 为 -1 或者链表中的一个 有效索引 。
我的题解方法一:双指针思路 ...
有效的括号
题目描述
题目链接:20. 有效的括号
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例1:
12输入:s = "()"输出:true
示例2:
12输入:s = "()[]{}"输出:true
示例3:
12输入:s = "(]"输出:false
提示:
1 <= s.length <= 10(4)
s 仅由括号 '()[]{}' 组成
我的题解方法一:栈思路非常经典的栈类型题目,当栈顶字符与当前字符匹配时,出栈即可;反之入栈,类似于消除游戏。最终如果栈为空则表示为有效的括号。
代码123456789101112131415161718192021class Solution { public boolean isValid(String s ...