链接:https://leetcode-cn.com/problems/balanced-binary-tree/
题目描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
完整代码:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: bool isBalanced(TreeNode* root) { if(!root) return true; return deepLengthDfs(root) >= 0; } int deepLengthDfs(TreeNode* root) { if(!root) return 0; int ld = deepLengthDfs(root->left); int rd = deepLengthDfs(root->right); if(ld >= 0 && rd >= 0 && abs(ld - rd) <= 1) { return max(ld , rd) + 1; } return -1; } };
链接:https://leetcode-cn.com/problems/add-two-numbers/
题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
完整代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* r1, ListNode* r2) { if(!r1) return r2; if(!r2) return r1; ListNode* root = new ListNode(0); ListNode* p = root; int ans = 0; while(r1 || r2 || ans) { int v1 = r1 ? r1->val : 0; int v2 = r2 ? r2->val : 0; int sum = v1 + v2 + ans; ListNode* t = new ListNode(sum%10); p->next = t; p = p->next; ans = sum/10; if(r1) r1 = r1->next; if(r2) r2 = r2->next; } return root->next; } };
链接:https://leetcode-cn.com/problems/climbing-stairs/
题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 4. 1 阶 + 1 阶 + 1 阶 5. 1 阶 + 2 阶 6. 2 阶 + 1 阶
完整代码:
解法:动态规划
class Solution { public: int climbStairs(int n) { if(n == 1) return n; int dp[3] = {0}; dp[0] = 1; dp[1] = 2; for(int i=2;i<n;i++) { dp[2] = dp[1]; dp[1] = dp[0] + dp[1]; dp[0] = dp[2]; } return dp[1]; } };