本文主要是介绍dp算法练习题【8】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不同二叉搜索树
96. 不同的二叉搜索树
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3 输出:5
示例 2:
输入:n = 1 输出:1
class Solution {public int numTrees(int n) {int[] dp = new int[n + 1];dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {// 左树种类 * 右树种类dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];}
}
不同二叉树Ⅱ
95. 不同的二叉搜索树 II
给你一个整数 n
,请你生成并返回所有由 n
个节点组成且节点值从 1
到 n
互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
输入:n = 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:
输入:n = 1 输出:[[1]]
class Solution {public List<TreeNode> generateTrees(int n) {return dfs(1, n);}List<TreeNode> dfs(int l, int r) {if (l > r) return new ArrayList<>(){{add(null);}};List<TreeNode> ans = new ArrayList<>();for (int i = l; i <= r; i++) {for (TreeNode x : dfs(l, i - 1)) {for (TreeNode y : dfs(i + 1, r)) {TreeNode root = new TreeNode(i);root.left = x; root.right = y;ans.add(root);}}}return ans;}
}
二叉树中的最大路径和
124. 二叉树中的最大路径和
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
示例 1:
输入:root = [1,2,3] 输出:6 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
class Solution {int maxSum = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) {maxGain(root);return maxSum;}private int maxGain(TreeNode node) {if (node == null) return 0;int leftGain = Math.max(maxGain(node.left), 0);int rightGain = Math.max(maxGain(node.right), 0);int currentSum = node.val + leftGain + rightGain;maxSum = Math.max(maxSum, currentSum);return node.val + Math.max(leftGain, rightGain);}
}
每日一题
2181. 合并零之间的节点
给你一个链表的头节点 head
,该链表包含由 0
分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val == 0
。
对于每两个相邻的 0
,请你将它们之间的所有节点合并成一个节点,其值是所有已合并节点的值之和。然后将所有 0
移除,修改后的链表不应该含有任何 0
。
返回修改后链表的头节点 head
。
示例 1:
输入:head = [0,3,1,0,4,5,2,0] 输出:[4,11] 解释: 上图表示输入的链表。修改后的链表包含: - 标记为绿色的节点之和:3 + 1 = 4 - 标记为红色的节点之和:4 + 5 + 2 = 11
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeNodes(ListNode head) {ListNode dummy = new ListNode();ListNode tail = dummy;int total = 0;for (ListNode cur = head.next; cur != null; cur = cur.next) {if (cur.val == 0) {ListNode node = new ListNode(total);tail.next = node;tail = tail.next;total = 0;} else {total += cur.val;}}return dummy.next;}
}
这篇关于dp算法练习题【8】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!