【LeetCode】力扣刷题热题100道(11-15题)附源码 环形链表 二叉树中序遍历 插入法(C++)

目录

1.字母异位词分组

2.环形链表

3.环形链表2

4.二叉树的中序遍历

5.搜索插入位置


1.字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。


排序字符:对于每个字符串,我们将其字符排序,得到一个唯一的 "排序后的字母" 作为该字符串的标识符(key)。
使用哈希表:利用哈希表(unordered_map)来将排序后的字母作为键(key),将相同字母异位词的字符串作为值(value)。如果两个字符串排序后得到相同的结果,它们属于同一组。
最终结果:哈希表中存储了多个键值对,其中每个键对应的值是一个字母异位词列表。

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> anagrams;for (const string& str : strs) {string sorted_str = str;sort(sorted_str.begin(), sorted_str.end());anagrams[sorted_str].push_back(str);}vector<vector<string>> result;for (auto& pair : anagrams) {result.push_back(pair.second);}return result;}
};

unordered_map<string, vector<string>> anagrams;:使用哈希表 anagrams 来存储字母异位词。键是排序后的字符串,值是一个包含所有字母异位词的字符串数组。

遍历每个字符串:

对每个字符串 str,我们创建它的副本 sorted_str。
使用 sort() 函数对 sorted_str 进行排序。
将排序后的 sorted_str 作为哈希表的键,原字符串 str 被添加到相应的值(即字母异位词组)中。
提取结果:哈希表中的每个值都是一个字母异位词的组,我们将所有这些组收集到 result 数组中并返回。

2.环形链表

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

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

初始化:

两个指针 slow 和 fast,都指向链表头部。
slow 每次走一步,fast 每次走两步。
循环遍历:

如果链表没有环,fast 指针最终会到达链表的末尾(即 fast 或 fast->next 为 NULL)。
如果链表有环,fast 指针和 slow 指针一定会相遇,因为 fast 走得比 slow 快,两者最终会在环内某个节点相遇。
判定条件:

如果在某个时刻 slow == fast,说明链表中存在环,返回 true。
如果 fast 指针走到链表末尾,即 fast 或 fast->next 为 NULL,说明链表没有环,返回 false。

/*** 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) {if (!head || !head->next) return false; // 空链表或只有一个节点没有环ListNode *slow = head;  // 慢指针ListNode *fast = head;  // 快指针while (fast && fast->next) {slow = slow->next;        // 慢指针走一步fast = fast->next->next;  // 快指针走两步if (slow == fast) {return true;  // 快慢指针相遇,说明链表中有环}}return false;  // 快指针走到链表末尾,说明无环}
};

3.环形链表2

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

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

初始化:

设置两个指针 slow 和 fast,都指向链表的头部。
环的检测:

slow 每次移动一步,fast 每次移动两步。
如果链表存在环,slow 和 fast 会在环中相遇。
如果链表没有环,fast 会在没有环的链表中走到 NULL,循环结束。
寻找环的入口:

当 slow 和 fast 相遇时,说明链表中有环。
将 slow 指针保持在相遇点,并将 entry 指针指向链表的头部。
然后,两个指针都以相同的速度(每次一步)移动,直到它们相遇。相遇点就是环的入口节点。
返回值:如果链表有环,返回环的入口节点;如果链表没有环,返回 NULL。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {if (!head || !head->next) return NULL;  // 空链表或者只有一个节点没有环ListNode *slow = head;  // 慢指针ListNode *fast = head;  // 快指针// 检测链表是否有环while (fast && fast->next) {slow = slow->next;        // 慢指针走一步fast = fast->next->next;  // 快指针走两步if (slow == fast) {// 当快慢指针相遇,说明有环ListNode *entry = head;  // 入口指针从头开始while (entry != slow) {entry = entry->next;slow = slow->next;}return entry;  // 返回环的入口节点}}return NULL;  // 没有环}
};

4.二叉树的中序遍历

给定一个二叉树的根节点root ,返回 它的 中序 遍历 。

如下为代码:

/*** 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:vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> stk;TreeNode* curr = root;while (curr != nullptr || !stk.empty()) {while (curr != nullptr) {stk.push(curr);curr = curr->left;}curr = stk.top();stk.pop();result.push_back(curr->val);curr = curr->right;}return result;}
};

vector<int> result; 用来存储中序遍历的结果。
stack<TreeNode*> stk; 用来模拟递归过程中访问的栈。
TreeNode* curr = root; 将 curr 初始化为二叉树的根节点,用来遍历树。
while (curr != nullptr || !stk.empty()):这个循环会一直进行,直到遍历完所有节点。条件判断包括两部分:
curr != nullptr:表示当前节点还存在。
!stk.empty():表示栈不为空,说明还有节点待访问。
while (curr != nullptr):这个内层循环将沿着左子树访问,直到当前节点为空。
在每一步,当前节点 curr 会被压入栈中 (stk.push(curr);),然后将 curr 移动到左子节点 (curr = curr->left;)。
当左子树遍历完毕后,栈顶的节点就是当前最左的节点。
curr = stk.top(); 从栈中取出栈顶节点,即当前最左的节点。
stk.pop(); 弹出栈顶节点,因为这个节点已经被访问过。
result.push_back(curr->val); 将当前节点的值添加到结果数组中。
curr = curr->right; 将 curr 移动到右子树节点,继续进行下一个循环。

5.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

代码如下所示:

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2; if (nums[mid] == target) {return mid; } else if (nums[mid] < target) {left = mid + 1;  } else {right = mid - 1; }}return left;}
};

int left = 0; 和 int right = nums.size() - 1;:初始化左右指针,分别指向数组的头部和尾部。
while (left <= right):这个循环会持续进行,直到找到目标值或确定目标值的插入位置。
int mid = left + (right - left) / 2;:计算中间位置。使用 left + (right - left) / 2 来避免 left + right 可能出现的溢出问题。
if (nums[mid] == target):如果 mid 位置的元素等于目标值,直接返回该索引。
else if (nums[mid] < target):如果 mid 位置的元素小于目标值,目标值应该在 mid 右侧,更新 left = mid + 1。
else:如果 mid 位置的元素大于目标值,目标值应该在 mid 左侧,更新 right = mid - 1。
return left;:如果循环结束时没有找到目标值,left 将指向目标值应该插入的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/892401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 3 和 Electron 来构建一个桌面端应用

我们将使用 Vue 3 和 Electron 来构建一个桌面端应用&#xff0c;该应用可以通过 Websocket 与服务器进行通信&#xff0c;并实现心跳检测、客户端上线、获取资产信息以及修改资产状态的功能。以下是实现步骤的概述&#xff1a; 项目结构&#xff1a;创建一个 Vue 3 项目&…

Java一个简单的反弹动画练习

文章目录 说明代码详解创建窗体代码创建绘图板创建线程 运行结果完整代码 说明 做了一个小球和星型做反弹动画的窗体作为练习&#xff0c;分享给大家&#xff0c;为了方便和我一样的小白可以看的比较明白&#xff0c;所以尽量详细的标注了注释&#xff0c;希望能帮到同样在学习…

监控观测数据标签体系的应用实践

前言 在复杂的应用系统环境下&#xff0c;监控数据量呈现出海量且繁杂的特点&#xff0c;如何高效地对这些监控数据进行管理、分析以及从中挖掘出有价值的信息&#xff0c;成为保障系统稳定运行和优化性能的关键所在。数据标签体系的建立就变得十分重要&#xff0c;它能够为监…

Vue中el-tree结合vuedraggable实现跨组件元素拖拽

实现效果&#xff1a; 左侧el-tree: <template><el-treeclass"filter-tree":data"treeData":props"defaultProps":filter-node-method"filterNode"node-key"id"draggable:allow-drop"allowDrop"node-dr…

PHP民宿酒店预订系统小程序源码

&#x1f3e1;民宿酒店预订系统 基于ThinkPHPuniappuView框架精心构建的多门店民宿酒店预订管理系统&#xff0c;能够迅速为您搭建起专属的、功能全面且操作便捷的民宿酒店预订小程序。 该系统不仅涵盖了预订、退房、WIFI连接、用户反馈、周边信息展示等核心功能&#xff0c;更…

在 Ubuntu 22.04 上从 Wayland 切换到 X11的详细步骤

在 Ubuntu 22.04 上从 Wayland 切换到 X11&#xff0c;步骤其实很简单&#xff0c;主要是在登录界面进行选择。以下是详细的步骤&#xff1a; 步骤 1&#xff1a;退出当前会话 首先&#xff0c;点击屏幕右上角的用户菜单&#xff0c;选择 注销 或 退出&#xff0c;以退出当前…

点击底部的 tabBar 属于 wx.switchTab 跳转方式,目标页面的 onLoad 不会触发(除非是第一次加载)

文章目录 1. tabBar 的跳转方式2. tabBar 跳转的特点3. 你的配置分析4. 生命周期触发情况5. 总结 很多人不明白什么是第一次加载&#xff0c;两种情况讨论&#xff0c;第一种情况假设我是开发者&#xff0c;第一次加载就是指点击微信开发者工具上边的编译按钮&#xff0c;每点击…

三维卷积( 3D CNN)

三维卷积&#xff08; 3D CNN&#xff09; 1.什么是三维卷积 1.1 三维卷积简介 二维卷积是在单通道的一帧图像上进行滑窗操作&#xff0c;输入是高度H宽度W的二维矩阵。 三维卷积输入多了深度C这个维度&#xff0c;输入是高度H宽度W深度C的三维矩阵。在卷积神经网络中&…

git 提交命令记录

1.已有本地和远程仓库 查看仓库远程地址: git remote -v 大量提交 git add . git commit -m "提交说明" git push 之后输入用户名密码 删除文件 git rm 文件名 替代git add 后面一样 2.全新提交 新建远程仓库 git init touch README.md git add . …

电脑硬盘系统迁移及问题处理

一、系统迁移准备 1、确认你的电脑主板是否支持安装两块硬盘,如电脑主板有多个M2硬盘接口,我们将新硬盘安装到主板上,原来的老硬盘安装在第二个接口上,主板只有一个M2接口的话可以使用移动硬盘盒。 2、新硬盘安装好后,我们进入原来的系统,在 此电脑–右键–管理–磁盘管…

游戏语音的历史是什么样的?

游戏中&#xff0c;离不开游戏社交。 无社交&#xff0c;不游戏&#xff0c;大家都深知社交在游戏体验中的重要性。 游戏语音的发展史是怎么样的&#xff1f;问了下AI&#xff0c;给我的回答是 早期阶段 1970年代&#xff1a;1970年代出现了第一个语音游戏“尤瓦尔的冒险”&am…

Go语言的循环实现

Go语言中的循环实现 引言 在编程中&#xff0c;循环是控制程序执行的重要结构&#xff0c;它允许程序重复执行某段代码&#xff0c;直到满足特定条件为止。不同的编程语言对循环的实现方式各有不同。在众多编程语言中&#xff0c;Go语言凭借其简洁性和高效性备受青睐。这篇文…

web服务器快速目录搜索遍历工具推荐:Dirsearch

Dirsearch是一个快速而强大的目录搜索工具。Dirsearch是一个用于在web服务器上遍历目录的多功能工具。使用Python编写&#xff0c;支持多线程&#xff0c;自定义请求以及与各种字典的配合。 安装方法&#xff1a; 确保安装了Python 3&#xff1a; sudo apt install python3下…

GDPU Android移动应用 重点习题集

目录 程序填空 ppt摘选 题目摘选 “就这两页ppt&#xff0c;你还背不了吗” “。。。” 打开ppt后 “Sorry咯&#xff0c;还真背不了&#x1f61c;” 更新日志 考后的更新日志 没想到重点勾了一堆&#xff0c;还愣是没考到其中的内容&#xff0c;翻了一下&#xff0c;原…

排序:插入、选择、交换、归并排序

排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性 &#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;…

CentOS7修改Docker默认存储路径

当你使用Docker时&#xff0c;Docker的默认配置是将镜像、容器和卷存储在系统/var/lib/docker/目录下&#xff0c;如果docker镜像安装的太多会导致磁盘不够&#xff0c;你可以尝试以下方法来释放空间&#xff1a; 清理无用的镜像和容器&#xff1a;使用docker命令删除不再使用…

计算机网络 (34)可靠传输的工作原理

前言 计算机网络可靠传输的工作原理主要依赖于一系列协议和机制&#xff0c;以确保数据在传输过程中能够准确无误地到达目的地。 一、基本概念 可靠传输指的是数据链路层的发送端发送什么&#xff0c;在接收端就收到什么&#xff0c;即保证数据的完整性、正确性和顺序性。由于网…

C++:string

一、string概念 之前介绍过通过字符数组保存字符串&#xff0c;然后对字符数组中的字符串做各种操作&#xff1b;为了更加简单方便&#xff0c;在C中&#xff0c;又增加了 string 来处理字符串。 char str[20] "hello world"; string 字符串其实是一种更加高级的封…

SQL Server 数据库给第三方用户开权限,限制可见内容

单独数据库权限的设置&#xff1a; 方法&#xff1a; 给外方公司开用户&#xff0c;让其访问本地有限资源。 分两步&#xff0c;1新建服务器登录名&#xff0c;2设置数据库用户权限 1&#xff0c;首先用管理员sa登录数据库&#xff0c;在服务器级别下“安全性\登录名”&#…

搭建一个fastapi的项目,调用ollama服务

1. 项目结构 my_project/ │ ├── app/ │ ├── main.py # FastAPI应用的入口 │ ├── services/ # 包含服务逻辑 │ │ └── ollama_service.py │ ├── models/ # 定义数据模型 │ │ └── response.py │ ├─…