题解43-48

news/2024/11/29 20:52:28/

124. 二叉树中的最大路径和 - 力扣(LeetCode)

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和

示例 1:

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

  • 树中节点数目范围是 [1, 3 * 104]
  • -1000 <= Node.val <= 1000
思路:

树形dp,实际上是在树上做dp,通过任何一个节点的路径最大值等于左边节点的最大值加上右边节点的最大值加上当前节点的值,我们dfs函数返回的是当前节点的最大值,需要返回给父节点,需要和0取较大值,其他的就简单了

/*** 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:int ans = INT_MIN;int dfs(TreeNode* node){if(node == nullptr) return 0;int left_ = dfs(node->left);int right_ = dfs(node->right);ans = max(ans, left_ + right_ + node->val);return max(0, max(left_, right_) + node->val);}int maxPathSum(TreeNode* root) {dfs(root);return ans;}
};

128. 最长连续序列 - 力扣(LeetCode)

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
思路:

哈希表来判断是否出现,我们只特判第一个数,故时间复杂度为 O ( n ) O(n) O(n)

class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> st(nums.begin(), nums.end());int res = 0;for(auto&num : st){if(st.find(num - 1) == st.end()){int last = num;while(st.find(last) != st.end())last += 1;res = max(res, last - num);}}return res;}
};

136. 只出现一次的数字 - 力扣(LeetCode)

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

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

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

示例 2 :

输入:nums = [4,1,2,1,2]
输出:4

示例 3 :

输入:nums = [1]
输出:1

提示:

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104
  • 除了某个元素只出现一次以外,其余每个元素均出现两次。
思路:

位运算,如果一个数出现了两次异或为0,所以异或完所有的数剩下的就是出现次数为1的数了

class Solution {
public:int singleNumber(vector<int>& nums) {for(int i = 1; i < nums.size(); i ++)nums[0] ^= nums[i];return nums[0];}
};

139. 单词拆分 - 力扣(LeetCode)

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 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

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • swordDict[i] 仅由小写英文字母组成
  • wordDict 中的所有字符串 互不相同
思路:

字符串哈希+递推

class Solution {
public:typedef unsigned long long ULL;const int P = 133;bool wordBreak(string s, vector<string>& wordDict) {unordered_set<ULL> hash;for(auto& word: wordDict){ULL h = 0;for(auto& c : word){h = h * P + c;}hash.insert(h);}int n = s.size();vector<bool> f(n + 1);f[0] = true;s = ' ' + s;// 前面一段是f[i],最后一段是i+1..jfor (int i = 0; i < n; i ++ ) {if (f[i]) { // 如果从1..i是有划分方法的,再去看f[i]为真会导致哪些f[j]为真ULL h = 0;for (int j = i + 1; j <= n; j ++ ) {h = h * P + s[j];if (hash.count(h))f[j] = true;}}}return f[n];}
};

141. 环形链表 - 力扣(LeetCode)

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

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

示例 3:
在这里插入图片描述

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

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos-1 或者链表中的一个 有效索引

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

思路:

龟兔赛跑的故事,一个走两步,一个走一步,能够追上当且仅当出现了环

class Solution {
public:bool hasCycle(ListNode *head) {ListNode *slow = head, *fast = head; // 乌龟和兔子同时从起点出发while (fast && fast->next) {slow = slow->next; // 乌龟走一步fast = fast->next->next; // 兔子走两步if (fast == slow) // 兔子追上乌龟(套圈),说明有环return true;}return false; // 访问到了链表末尾,无环}
};

http://www.ppmy.cn/news/1353595.html

相关文章

文件管理大师:深入解析Linux的文件与目录操控

目录 一、文件命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名大小写 4、Linux文件扩展名 二、文件管理命令 1、目录创建/删除 mkdir创建目录 直接创建文件夹 创建多个文件夹 递归创建写法 总结mkdir 删除空目录 2、文件创建、删除 touch创建文…

【开源】JAVA+Vue.js实现大学计算机课程管理平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

Java实现课程案例资源库系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员需求分析2.2 用户需求分析 三、系统设计3.1 业务流程设计3.1.1 管理员业务流程设计3.1.2 用户业务流程设计3.1.3 首页功能模块及业务流程分析3.1.4 案例资源中心功能模块及业务流程分析3.1.5 用户信息中心功能模块…

人工智能技术及其在生物制药领域不断扩大的作用

今天分享的是人工智能系列深度研究报告&#xff1a;《人工智能技术及其在生物制药领域不断扩大的作用》。 &#xff08;报告出品方&#xff1a;毕马威&#xff09; 报告共计&#xff1a;18页 来源&#xff1a;人工智能学派 前言 在生物制药领域&#xff0c;人工智能(AI)已…

基于微信小程序的智能社区服务小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

(02)Hive SQL编译成MapReduce任务的过程

目录 一、架构及组件介绍 1.1 Hive底层架构 1.2 Hive组件 1.3 Hive与Hadoop交互过程 二、Hive SQL 编译成MR任务的流程 2.1 HQL转换为MR源码整体流程介绍 2.2 程序入口—CliDriver 2.3 HQL编译成MR任务的详细过程—Driver 2.3.1 将HQL语句转换成AST抽象语法树 词法、语…

10-k8s中pod的探针

一、探针的概念 一般时候&#xff0c;探针的设置&#xff0c;都是为了优化业务时&#xff0c;需要做的事情&#xff1b;属于后期工作&#xff1b; 1&#xff0c;探针的分类 1&#xff0c;健康状态检查探针&#xff1a;livenessProbe 当我们设置了这个探针之后&#xff0c;检查…

异质结太阳能电池中氢化本征非晶硅的设计

在硅异质结太阳能电池&#xff08;SHJ&#xff09;中&#xff0c;pn结由两种不同形貌的硅形成&#xff0c;即一种是n型晶体硅&#xff08;c-Si&#xff09;&#xff0c;另一种是p掺杂&#xff08;III族&#xff09;元素掺杂&#xff09;非晶硅&#xff08;a-Si&#xff09;。许…