111. 二叉树的最小深度

难度简单365

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3/ \9  20/  \15   7

返回它的最小深度  2.

 int minDepth(TreeNode* root) {if(root==NULL) return 0;queue<TreeNode*> q;q.push(root);int step=1;while(!q.empty()){//注意,不是单个单个节点扩散。而是一排就扩散!!!int sz=q.size();for(int i=0;i<sz;i++){TreeNode* now=q.front();q.pop();if(now->left==NULL&&now->right==NULL) return step;if(now->left!=NULL) q.push(now->left);if(now->right!=NULL) q.push(now->right);}step++;}return step;}
class Solution {public int minDepth(TreeNode root) {if (root == null) return 0;else if (root.left == null) return minDepth(root.right) + 1;else if (root.right == null) return minDepth(root.left) + 1;else return Math.min(minDepth(root.left), minDepth(root.right)) + 1;}
}

112. 路径总和

难度简单429

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例: 
给定如下二叉树,以及目标和 sum = 22

              5/ \4   8/   / \11  13  4/  \      \7    2      1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2

我在梦里做过吗??

为什么感觉做过啊

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool hasPathSum(TreeNode* root, int sum) {if(root==NULL) return false;queue<TreeNode*> q;queue<int> num;q.push(root);num.push(root->val);while(!q.empty()){TreeNode* now=q.front();q.pop();int number=num.front();num.pop();if(now->left==NULL&&now->right==NULL){if(number==sum) return true;}if(now->left!=NULL){q.push(now->left);num.push(number+now->left->val);}if(now->right!=NULL){q.push(now->right);num.push(number+now->right->val);}}return false;}
};
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool ans=false;void dfs(bool& ans,TreeNode* root,int num,int sum){if(ans==true) return;if(sum==num&&root->left==NULL&&root->right==NULL){ans=true;return;}if(root->left!=NULL) dfs(ans,root->left,num+root->left->val,sum);if(root->right!=NULL) dfs(ans,root->right,num+root->right->val,sum);}bool hasPathSum(TreeNode* root, int sum) {if(root==NULL) return false;dfs(ans,root,root->val,sum);return ans;}
};

113. 路径总和 II

难度中等318

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22

              5/ \4   8/   / \11  13  4/  \    / \7    2  5   1

返回:

[[5,4,11,2],[5,8,4,5]
]

class Solution {
public:void dfs(vector<int> tmp,vector<vector<int>>& ans,TreeNode* root,int num,int sum){if(sum==num&&root->left==NULL&&root->right==NULL){ans.push_back(tmp);return;}if(root->left!=NULL){tmp.push_back(root->left->val);dfs(tmp,ans,root->left,num+root->left->val,sum);tmp.pop_back();}if(root->right!=NULL){tmp.push_back(root->right->val);dfs(tmp,ans,root->right,num+root->right->val,sum);tmp.pop_back();}}vector<vector<int>> pathSum(TreeNode* root, int sum) {vector<vector<int>> ans;if(root==NULL) return ans;vector<int> tmp;tmp.push_back(root->val);dfs(tmp,ans,root,root->val,sum);return ans;}
};

114. 二叉树展开为链表

难度中等552

给定一个二叉树,原地将它展开为一个单链表。

例如,给定二叉树

    1/ \2   5/ \   \
3   4   6

将其展开为:

1\2\3\4\5\6

话说这个答案是我抄的吗?


class Solution {
public:void flatten(TreeNode* root) {//先序遍历的顺序吗?//这,修改链表,不要慌,好好看看是怎么修改连接的。并且还是二叉树那就和可能是递归啊//结合遍历顺序作答。if(root==NULL) return;flatten(root->left);flatten(root->right);if(root->left!=NULL){TreeNode* last=root->left;//左子树最后一个节点while(last->right!=NULL) last=last->right;last->right=root->right;root->right=root->left;root->left=NULL;}}
};

115. 不同的子序列

难度困难257

给定一个字符串 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。

一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)

题目数据保证答案符合 32 位带符号整数范围。

示例 1:

输入:S = "rabbbit", T = "rabbit"
输出3
解释:

如下图所示, 有 3 种可以从 S 中得到 "rabbit" 的方案。
(上箭头符号 ^ 表示选取的字母)rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^

示例 2:

输入:S = "babgbag", T = "bag"
输出5
解释:

如下图所示, 有 5 种可以从 S 中得到 "bag" 的方案。
(上箭头符号 ^ 表示选取的字母)babgbag
^^ ^
babgbag
^^    ^
babgbag
^    ^^
babgbag^  ^^
babgbag^^^
//超时递归....
class Solution {
public:int cnt=0;void dfs(string s,string t,int i,int j){if(j==t.size()){cnt++;return;}if(i>=s.size()) return;if(s[i]==t[j]){dfs(s,t,i+1,j+1);//选择//不选择dfs(s,t,i+1,j);}else{dfs(s,t,i+1,j);}}int numDistinct(string s, string t) {//递归?if(s.size()<t.size()) return 0;if(s.size()==t.size()) return s==t?1:0;//开始处理dfs(s,t,0,0);return cnt;}
};

116. 填充每个节点的下一个右侧节点指针

难度中等243

给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例:

输入:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":{"$id":"6","left":null,"next":null,"right":null,"val":6},"next":null,"right":{"$id":"7","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}输出:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":{"$id":"6","left":null,"next":null,"right":null,"val":7},"right":null,"val":6},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"7","left":{"$ref":"5"},"next":null,"right":{"$ref":"6"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"7"},"val":1}解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。
/*
// Definition for a Node.
class Node {
public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left, Node* _right, Node* _next): val(_val), left(_left), right(_right), next(_next) {}
};
*/class Solution {
public:Node* connect(Node* root) {//这看上去很简单,就层序遍历啊if(root==NULL) return root;// Node* tmpqueue<Node*> q;q.push(root);while(!q.empty()){int size=q.size();Node* pre=q.front();q.pop();if(pre->left!=NULL) q.push(pre->left);if(pre->right!=NULL) q.push(pre->right);for(int i=1;i<size;i++){Node* cur=q.front();q.pop();pre->next=cur;pre=cur;if(cur->left!=NULL) q.push(cur->left);if(cur->right!=NULL) q.push(cur->right);}pre->next=NULL;}return root;}
};

117. 填充每个节点的下一个右侧节点指针 II

难度中等198

给定一个二叉树

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

进阶:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

示例:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。

提示:

  • 树中的节点数小于 6000
  • -100 <= node.val <= 100

class Solution {
public:Node* connect(Node* root) {//这看上去很简单,就层序遍历啊if(root==NULL) return root;// Node* tmpqueue<Node*> q;q.push(root);while(!q.empty()){int size=q.size();Node* pre=q.front();q.pop();if(pre->left!=NULL) q.push(pre->left);if(pre->right!=NULL) q.push(pre->right);for(int i=1;i<size;i++){Node* cur=q.front();q.pop();pre->next=cur;pre=cur;if(cur->left!=NULL) q.push(cur->left);if(cur->right!=NULL) q.push(cur->right);}pre->next=NULL;}return root;}
};

118. 杨辉三角

难度简单350

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5
输出:
[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]
]
错一位再逐个相加等~等~等~

120. 三角形最小路径和

难度中等593

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

相邻的结点 在这里指的是 下标上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。

例如,给定三角形:

[[2],[3,4],[6,5,7],[4,1,8,3]
]

自顶向下的最小路径和为 11(即,3 + 1 = 11)。

说明:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

LeetCode 111-120题 尚未看题解相关推荐

  1. [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]

    [问题描述][中等] [解答思路] 1. 动态规划思路一 自上而下 第 1 步:设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 ...

  2. 设计链表(Leetcode第707题)

    此题涵盖了链表的常见操作,是练习链表操作非常好的一道题目 此题涵盖了链表的常见操作,是练习链表操作非常好的一道题目 此题涵盖了链表的常见操作,是练习链表操作非常好的一道题目 题目描述: 设计链表的实现 ...

  3. LeetCode 每日一题 42. 接雨水 详细多种题解 C++描述

    LeetCode 每日一题 42. 接雨水 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,一起加油吧~ 难度 困难 2020.04.04每日一题 ...

  4. leetcode分类刷题笔记

    leetcode分类刷题笔记--基于python3 写在前面 1.做题如果实在想不出时间复杂度比较优的解法,可以先写出暴力解法,尝试在其基础上优化 2.排序.双指针.二分等--经常可以优化时间复杂度 ...

  5. #19ACM第一次招新补题赛de题解呐#

    听说需要交一份题解? A.最简单签到,没有之一 不得不说这道简单签到 太强了- 先来看看题目吧 ↓ 描述: 此题简单如题意,就是求最大值输入: 多组输入 每组输入输入一串字符串(包括字母和数字),长度 ...

  6. 【算法】1041- 图解 LeetCode第 70 题爬楼梯问题

    最近开始努力研究算法,遇到这个很有意思的题目,因为从中复习到斐波那契数列,又通过某篇资料,查到中科院官网,看了很多科普文章.深挖下去能看到很多东西. 本着热爱分享的初衷,整理本文与大家分享,题目本身没 ...

  7. 【Leetcode】 刷题之路1(python)

    leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...

  8. 【Leetcode】刷题题单记录

    程序=算法+数据结构,不管干哪一行,只要涉及到编程算法始终是最重要的!!! 算法基础差,变做题巩固!!! LeetCode刷题,搞起来! 由于我只会C++和Python, 所以题解只有C++ 和 Py ...

  9. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

最新文章

  1. python dir函数查看函数名
  2. jQuery最佳实践
  3. oracle导出库压缩参数,oracle数据库的定时备份:导出 压缩 归类
  4. 正则表达式,VI,SED及shell编程2010-12-05
  5. 交大计算机基础知识第一次作业,上海交大计算机第一次作业
  6. 图片类关于实现图片剪切功能的相关类的学习心得
  7. php怎么创建两条折线图,excel折线图怎么做两条
  8. liferay 6.2 主题开发
  9. WiFi 扫描结果的通知过程
  10. 【机械仿真】基于matlab GUI智能电梯仿真系统【含Matlab源码 1087期】
  11. 全国各省市固定资本形成额数据 (1990-2018年)
  12. 无法登录苹果开发者_利用Apple Developer申请苹果开发者账号(解决支付授权失败问题)...
  13. 计算机学院青协特色活动,计算机学院青年志愿者协会纳新活动简讯
  14. 陶哲轩论文解析:从特征值到特征向量
  15. 两台路由器的连接方法和无线路由桥接
  16. javascript中onclick(this)用法和onclick(this.value)用法介绍
  17. MySQL Workbench 8.0新建SCHEMAS和Table
  18. 错误页面不暴漏,显示到一个漂亮页面
  19. 斜杠 反斜杠  双斜杠 双反斜杠
  20. 2020年汽车驾驶员(高级)报名考试及汽车驾驶员(高级)在线考试

热门文章

  1. FANUC机器人6点示教法设定工具坐标系的具体步骤
  2. lua调试的工具选择
  3. 法原子能机构将福岛核电站爆炸事故提升至6级
  4. NKOI 1905 慢跑小路
  5. 给定平面上任意三个点的坐标(x​1,y​1)、(x​2​​ ,y​2​​)、(x​3​​ ,y​3​​),检验它们能否构成三角形
  6. 微信分享链接不显示缩略图
  7. Freeswitch 对接 unimrcpserver ASR调用
  8. 一年三 季 醋 泡 姜
  9. 聚焦“教-学-评-测-练-管一体化”,推动新型人才培养
  10. 华为OD机试(A、B卷)、机考,200分的题目整理如下,冲满分必备