102. 二叉树的层序遍历

难度中等589收藏分享切换为英文关注反馈

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:
二叉树:[3,9,20,null,null,15,7],

    3/ \9  20/  \15   7

返回其层次遍历结果:

[[3],[9,20],[15,7]
]
class Solution {
public: vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;queue<TreeNode*> queue;if (root != nullptr) queue.push(root);while (!queue.empty()) {int n = queue.size();vector<int> level;for (int i = 0; i < n; ++i) {TreeNode* node = queue.front();queue.pop();level.push_back(node->val);if (node->left != nullptr) queue.push(node->left);if (node->right != nullptr) queue.push(node->right);}res.push_back(level);}return res;}
};

104. 二叉树的最大深度

难度简单660收藏分享切换为英文关注反馈

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

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

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

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

    3/ \9  20/  \15   7
class Solution {
public:int maxDepth(TreeNode* root) {if(root==NULL) return 0;else return max(maxDepth(root->left),maxDepth(root->right))+1;}
};

105. 从前序与中序遍历序列构造二叉树

难度中等607收藏分享切换为英文关注反馈

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3/ \9  20/  \15   7

class Solution {
public:void get(TreeNode* &root,int lp,int rp,int li,int ri,vector<int> preorder,vector<int> inorder){if(lp>rp) return;int val=preorder[lp];root=new TreeNode(val);int zhi=li;for(int j=li;j<=ri;j++){if(inorder[j]==val){zhi=j;break;}}int len=zhi-li;//len=1get(root->left,lp+1,lp+len,li,zhi-1,preorder,inorder);get(root->right,lp+len+1,rp,zhi+1,ri,preorder,inorder);}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {TreeNode* root=NULL;get(root,0,preorder.size()-1,0,inorder.size()-1,preorder,inorder);return root;}
};

114. 二叉树展开为链表

难度中等499收藏分享切换为英文关注反馈

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

例如,给定二叉树

    1/ \2   5/ \   \
3   4   6

将其展开为:

1\2\3\4\5\6
解题思路
题目本质就是把树的左子树全部并到右子树中,虽然没说顺序,但按示例,就是前序了。
也就是说,要把root的右子树,放到左子树的最后一个结点的右子树中。至于左右子树,各自的处理,就是标准的递归了。
所以递归函数的步骤可以理解如下:当root为空时,不处理;
递归处理root的左子树;
递归处理root的右子树;(当然左右子树也可以后面再处理)
当root没有左子树时,无需处理;
当root有左子树时,要找到最后一个结点last,从root.left开始往下找(因为是已经处理完的,所以root.left只有右子树),循环找right直到最后一个结点即可;
关键:将root的右子树移到last的右指针,last.right = root.right;
root的左子树移到root的右指针:root.right = root.left;
清空root的左指针:root.left = null;作者:gousiqi
链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/solution/na-ge-wai-mai-de-gong-fu-tu-ran-xiang-tong-liao-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。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;}}
}

121. 买卖股票的最佳时机

难度简单1126收藏分享切换为英文关注反馈

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

注意:你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

典型题目,I还是很好想的,记得复习统一的思路。

非常基础的动态规划!
假如计划在第 i 天卖出股票,那么最大利润的差值一定是在[0, i-1]
之间选最低点买入;所以遍历数组,依次求每个卖出时机的的最大差值,再从中取最大值。int maxProfit(vector<int>& prices) {if(prices.size()==0) return 0;int minx=prices[0];int ans=0;for(int i=1;i<prices.size();i++){ans=max(ans,prices[i]-minx);minx=min(minx,prices[i]);}return ans;}

124. 二叉树中的最大路径和

难度困难631收藏分享切换为英文关注反馈

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]1/ \2   3输出: 6

示例 2:

输入: [-10,9,20,null,null,15,7]-10/ \9  20/  \15   7输出: 42
class Solution {
public:
//任意节点诶....
// 对于二叉树中的一个节点,该节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值,如果子节点的最大贡献值为正,则计入该节点的最大路径和,否则不计入该节点的最大路径和。int ans=INT_MIN;int OneSide(TreeNode* root){if(root==NULL) return 0;int l=max(0,OneSide(root->left));int r=max(0,OneSide(root->right));ans=max(ans,l+r+root->val);return max(l,r)+root->val;}int maxPathSum(TreeNode* root) {if(root==NULL) return 0;OneSide(root);return ans;}
};

136. 只出现一次的数字

难度简单1415收藏分享切换为英文关注反馈

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4
class Solution {
public:int singleNumber(vector<int>& nums) {
int single = 0;for (int num : nums) {single ^= num;}return single;}
};
//位运算就是牛逼!!!

139. 单词拆分

难度中等612收藏分享切换为英文关注反馈

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

  • 拆分时可以重复使用字典中的单词。
  • 你可以假设字典中没有重复的单词。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。注意你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
动态规划听上去非常高大上,但是其实都是源自于一个很自然的想法,就拿这道题来说,假如需要判断"onetwothreefour"这一个字符串能不能满足条件,我们很自然的想法就是:
如果"onetwothree"这一段可以拆分,再加上four如果也可以,那不就行了;
或者
如果"onetwothre"这一段可以拆分,再加上efour如果也可以,那不就行了;
这其实已经抓住了动态规划的最核心的东西了,换成式子来表达,就是
dp["onetwothreefour"] = dp["onetwothree"这一段] && 判断一下"four"
dp["onetwothreefour"] = dp["onetwothre"这一段] && 判断一下"efour"遍历顺序稍微有点窍门,就是:要判断dp[j],最好按照 dp[j-1]&&check() -> dp[j-2]&&check -> dp[0]&&check()这个顺序,理由很简单,这样的话check的部分就相当于判断单词是否存在,仔细想想呗~class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {int n = s.size();vector<bool> dp(n + 1, false);unordered_map<string,int> mp;for(string str:wordDict){mp[str]=1;}dp[0] = true;//i代表长度。for (int i = 1; i <= n; i++) {for(int j=0;j<i;j++){dp[i]=dp[j]&&mp.count(s.substr(j,i-j));if(dp[i]) break;}// cout<<i<<" "<<dp[i];}return dp[n];}
};作者:RED_DEVIL
链接:https://leetcode-cn.com/problems/word-break/solution/dan-ci-chai-fen-ju-
jue-zhuang-xcong-jian-dan-de-xi/

141. 环形链表

难度简单704收藏分享切换为英文关注反馈

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos-1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:
/*bool hasCycle(ListNode *head) {unordered_map<ListNode*,int> mp;// int count=0;while(head!=NULL){if(mp.find(head)!=mp.end()) return true;mp[head]=1;head=head->next;}return false;}
*///快慢指针bool hasCycle(ListNode *head){if(head==NULL) return false;ListNode* first=head;ListNode* second=head;while(first->next&&first->next->next){first=first->next->next;second=second->next;if(first==second) return true;}return false;}
};

LeetCode hot-100 简单and中等难度,41-50.相关推荐

  1. LeetCode hot-100 简单and中等难度,81-90.

    打家劫舍系列题 198. 打家劫舍 难度简单1005收藏分享切换为英文关注反馈 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防 ...

  2. LeetCode hot-100 简单and中等难度,91-100.

    461. 汉明距离 难度简单307收藏分享切换为英文关注反馈 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意: 0 ≤ ...

  3. LeetCode hot-100 简单and中等难度,21-30.

    46. 全排列 难度中等829 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3 ...

  4. LeetCode155:最小栈,最简单的中等难度题,时间击败100%,内存也低于官方

    本篇概览 最近运气不错,在LeetCode上白捡一道送分题,官方设定的难度是中等,然而此题难度放在简单的题库中都是垫底的存在,对于刷题数太少的欣宸而言,这简直就是力扣的馈赠,建议大家也不要错过,花上几 ...

  5. LeetCode hot-100 简单and中等难度,61-70.

    207. 课程表 难度中等520 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 . 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成 ...

  6. LeetCode hot-100 简单and中等难度,71-80.

    279. 完全平方数 难度中等538收藏分享切换为英文关注反馈 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少 ...

  7. LeetCode hot-100 简单and中等难度,51-60.

    142. 环形链表 II 难度中等570收藏分享切换为英文关注反馈 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示 ...

  8. LeetCode hot-100 简单and中等难度,31-40.

    75. 颜色分类 难度中等527收藏分享切换为英文关注反馈 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...

  9. LeetCode数据库SQL题目记录(难度:简单)

    难度:简单 目录 175. 组合两个表 176. 第二高的薪水 181. 超过经理收入的员工 182. 查找重复的电子邮箱 183. 从不订购的客户 196. 删除重复的电子邮箱 197. 上升的温度 ...

最新文章

  1. 基础知识:页面div始终浮在浏览器顶部
  2. 【126】TensorFlow 使用皮尔逊相关系数找出和标签相关性最大的特征值
  3. 【译】Tutorials ---- Hello, World
  4. 数据表-java类的映射
  5. C语言试题二十三之编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中
  6. mysql整站源码安装_MySQL入门01-MySQL源码安装
  7. python画图灰白_python 站点资料插值画图及白化
  8. OPTEE之安全存储详解
  9. 关于MongoDB时区问题
  10. matlab Tricks(二十七)—— 可变输入参数输出参数的适配
  11. Selenium webdriver实现原理
  12. 杨辉三角的几种 Python 实现方法
  13. UVA 11991 Easy Problem from Rujia Liu?
  14. 分析家数据格式、结构
  15. TAPD 完整项目工作流
  16. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一2.9 疏密相间构图法
  17. 他两次都没感动CCTV,却真正感动了中国
  18. kubeadm方式搭建k8s集群
  19. [联想官方工具]关闭Win10自动更新工具 最新版 2.6.21.816
  20. C++四个数排序(从小到大)

热门文章

  1. Charles介绍与使用
  2. 算命的理科生——顺口说说算命的事......
  3. Stratifyd入驻腾讯云市场,AI赋能品牌数字化升级
  4. Android数据备份(Android Data Backup)
  5. 2023年,哪些Web3赛道的表现最值得期待?(文末有奖)
  6. 代码情诗——一份真情请查收
  7. python读取数据的函数详解_python如何从文件读取数据及解析
  8. 微服务架构之服务调用
  9. 统计学上数据的处理和图标的展示原则
  10. vue项目的首屏优化策略