基础数据结构思路写法记录,便于回顾
重思路非代码。基础的思路搞懂了,变形题目顺着思考基本都能写出来!
二分查找
int binarySearch(vector<int> &nums, int target) {// write your code hereif (nums.empty()) {return -1;}int start = 0;int end = nums.size() - 1;while (start + 1 < end) {int mid = start + (end - start) / 2;if (nums[mid] >= target) { // 有重复的输出第一个end = mid;} else {start = mid;}/*if (nums[mid] <= target) { // 有重复的输出最后一个start = mid;} else {end = mid;}*/}if (nums[start] == target) {return start;}if (nums[end] == target) {return end;}return -1;}
链表逆序
class Solution {
public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr) {return head;}// 注意的是先画图, 代码自然就能写出来ListNode* prev = nullptr;ListNode* cur = head; while (cur != nullptr) {ListNode* tmp = cur->next;cur->next = prev;prev = cur;cur = tmp;}return prev;}
};
二叉树遍历
// 前序
class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {if (root == nullptr) {return {};}stack<TreeNode*> s;// s.push(root);vector<int> res;while (!s.empty() || root) {if (root) {res.push_back(root->val);s.push(root);root = root->left;} else {root = s.top();s.pop();root = root->right;}}return res;}
};// 中序
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;if (root == nullptr) {res;}stack<TreeNode*> s;// s.push(root);while (!s.empty() || root) {if (root) {s.push(root);root = root->left;} else {root = s.top();res.push_back(root->val);s.pop(); root = root->right;}}return res;}
};// 后序
class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {if (root == nullptr) {return {};}vector<int> res;stack<TreeNode*> s;while (!s.empty() || root) {if (root) {s.push(root);res.push_back(root->val);root = root->right;} else {root = s.top();s.pop();root = root->left;}}std::reverse(res.begin(), res.end());return res;}
};// 层序
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (root == nullptr) {return res;}queue<TreeNode*> q;q.push(root);TreeNode split = TreeNode(INT_MAX);q.push(&split);vector<int> layer;while (!q.empty()) {TreeNode *cur = q.front();q.pop();if (cur == &split) {res.push_back(layer);layer.clear(); // 注意别忘记清理if (!q.empty()) {q.push(&split);}} else {layer.push_back(cur->val);if (cur->left) {q.push(cur->left);}if (cur->right) {q.push(cur->right);}}}return res;}
};
N叉树
class Solution {
public:vector<int> preorder(Node* root) {vector<int> res;if (root == nullptr) {return res;}//helper(root, res); // 递归版本stack<Node*> s;s.push(root);while (!s.empty()) {Node* cur = s.top();s.pop();if (cur != nullptr) {res.push_back(cur->val);}std::reverse(cur->children.begin(), cur->children.end());for (auto &node : cur->children) {s.push(node);}}return res;}/*void helper(Node* root, vector<int>& out) {if (root == nullptr) {return;}out.push_back(root->val);for (int i = 0; i < root->children.size(); ++i) {helper(root->children[i], out);}}*/
};
基础排序
/* 归并排序 */// merge
void merge(vector<int>& nums, int low, int high, vector<int>& tmp) {int mid = (low + high) / 2;int leftIndex = low;int rightIndex = mid + 1;int resLeftIndex = leftIndex;while (leftIndex <= mid && rightIndex <= high) {// leftIndex 135 // rightIndex 246// resLeftIndex 123456if (nums[leftIndex] >= nums[rightIndex]) {tmp[resLeftIndex++] = nums[rightIndex++];}else {tmp[resLeftIndex++] = nums[leftIndex++];}}while (leftIndex <= mid) {tmp[resLeftIndex++] = nums[leftIndex++];}while (rightIndex <= high) {tmp[resLeftIndex++] = nums[rightIndex++];}for (int i = low; i <= high; ++i) { // 易错点 <=nums[i] = tmp[i];}
}// 分治
void divideConquer(vector<int>& nums, int low, int high, vector<int>& tmp) {if (low >= high) {return;}// 分而治之divideConquer(nums, low, (high + low) / 2, tmp);divideConquer(nums, (high + low) / 2 + 1, high, tmp);// 合并有序数组merge(nums, low, high, tmp);
}void mergeSort(vector<int>& nums) {if (nums.empty()) {return;}vector<int> tmp(nums.size());divideConquer(nums, 0, nums.size() - 1, tmp);
}int main()
{vector<int> nums = { 2, -1, 4, 55, 0, 67, -23, 5, 9 };//quickSortNotR(nums, 0, nums.size() - 1);mergeSort(nums);for (auto item : nums) {cout << item << " ";}cout << endl;return 0;
}// 快速排序
int getPartSortIndex(vector<int>& nums, int low, int high) {int tmp = nums[low]; // TODO:随机取值int i = low;int j = high;while (i <j) {while (i < j && nums[j] >= tmp) {j--;}nums[i] = nums[j];while (i < j && nums[i] <= tmp) {i++;}nums[j] = nums[i];}nums[i] = tmp;return i;
}// 递归版本
void quickSort(vector<int>& nums, int low, int high) {if (low >= high) {return;}int index = getPartSortIndex(nums, low, high);quickSort(nums, low, index - 1);quickSort(nums, index + 1, high);
}// 非递归版本
void quickSortNotR(vector<int>& nums, int low, int high) { if (low >= high) {return;}stack<int> s;s.emplace(low);s.emplace(high);while (!s.empty()) {int right = s.top();s.pop();int left = s.top();s.pop();int index = getPartSortIndex(nums, left, right);if (index - 1 > left) {s.emplace(left);s.emplace(index - 1);}if (index + 1 < right) {s.emplace(index + 1);s.emplace(right);}}
}
相关文章:
基础数据结构思路写法记录,便于回顾
重思路非代码。基础的思路搞懂了,变形题目顺着思考基本都能写出来! 二分查找 int binarySearch(vector<int> &nums, int target) {// write your code hereif (nums.empty()) {return -1;}int start 0;int end nums.size() - 1;while (star…...

基于AI的量化投资框架Qlib的Python依赖包pyqlib安装问题记录
版权声明:本文为博主原创文章,如需转载请贴上原博文链接:基于AI的量化投资框架Qlib的Python依赖包pyqlib安装问题记录-CSDN博客 前言:最近想使用Qlib来做量化交易的策略研究,但是第一步就卡在了安装pyqlib依赖包&#…...
《语音识别方案选择》
《语音识别方案选择》 一、引言二、语音识别技术概述(一)语音识别的基本原理(二)语音识别技术的发展历程(三)语音识别技术的分类1、基于声学模型的语音识别2、基于语言模型的语音识别3、端到端的语音识别 三…...
目标检测数据集图片及标签同步裁剪
目录 前言 具体方法 使用介绍 完整代码 前言 在目标检测任务中,模型的训练依赖于大量高质量的标注数据。然而,获取足够多的标注数据集往往代价高昂,并且某些情况下,数据集中的样本分布不均衡,这会导致模型的泛化能…...
【设计模式-简单工厂】
定义 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于通过一个工厂类来创建某个产品类的实例,而不直接在客户端(调用方)中实例化对象。 这种模式的主要思想是将对象的创建逻辑集中在一个…...
多个版本的GCC(GNU编译器集合)可以同时安装并存
在Ubuntu系统中,多个版本的GCC(GNU编译器集合)可以同时安装并存。GCC是编译C、C以及其他编程语言程序的重要工具,不同的项目可能需要不同版本的GCC来确保兼容性。 为什么需要多个GCC版本 项目依赖:不同的软件项目可能…...
量子纠错--shor‘s 码
定理1 (量子纠错的条件) C是一组量子编码,P是映射到C上的投影算子。假设是一个算子元素描述的量子操作,那么基于量子编码C,存在一个能对抗描述的噪声的纠错操作R的充要条件是 对某个复元素厄米矩阵成立。 将算子元素称为导致的错误。如果这样…...
机器学习2
一、模型评估方法 1.1 K折交叉验证法(K-Fold Cross Validation) 1.1.1 定义 K折交叉验证法是一种用于评估模型性能的技术。它将数据集分为K个相等的子集,模型会轮流使用一个子集作为测试集,其余K-1个子集作为训练集。这个过程会…...

二分查找_ x 的平方根搜索插入位置山脉数组的峰顶索引
x 的平方根 在0~X中肯定有数的平方大于X,这是肯定的。我们需要从中找出一个数的平方最接近X且不大于X。0~X递增,它们的平方也是递增的,这样我们就可以用二分查找。 我们找出的数的平方是<或者恰好X,所以把0~X的平方分为<X …...

汽车建模用什么软件最好?汽车建模渲染建议!
在汽车建模和渲染领域,选择合适的软件对于实现精确的设计与高质量的视觉效果至关重要。那么不少的汽车设计师如何选择合适的建模软件与渲染方案呢,一起来简单看看吧! 一、汽车建模用软件推荐 1、Alias Autodesk旗下的Alias系列软件是汽车设…...

蘑菇分类识别数据集(猫脸码客 第222期)
蘑菇分类识别文本/图像数据集 蘑菇,作为一种广泛分布于全球的真菌,隶属于伞菌目伞菌亚门蘑菇科蘑菇属,拥有众多别名,如白蘑菇、洋蘑菇等。其不仅是世界上人工栽培最广泛、产量最高、消费量最大的食用菌品种之一,还在许…...

长短期记忆网络(Long Short-Term Memory,LSTM)
简介:个人学习分享,如有错误,欢迎批评指正。 长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种特殊的循环神经网络(Recurrent Neural Network,简称RNN)架构&#…...
WHAT - 引入第三方组件或项目使用需要注意什么
目录 1. 功能匹配2. 社区与维护3. 兼容性4. 性能5. 易用性6. 安全性7. 授权和许可证8. 国际化支持9. 依赖性10. 未来维护 在前端开发过程中引入第三方组件或项目时,应该从以下几个方面进行考虑,以确保引入的组件能够有效解决问题并适合长期维护ÿ…...

原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
华为于10月22日19:00举办“原生鸿蒙之夜暨华为全场景新品发布会”。此次发布会推出全新的原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)以及nova 13、WATCH Ultimate、MatePad Pro等新品。 据介绍,此前已经发布过的鸿蒙系统,由于系…...

WindTerm配置快捷键Ctrl+C和Ctrl+V
WindTerm配置快捷键CtrlC和CtrlV 平时使用ssh和sftp连接的时候,经常使用windterm, 但是windterm里面找不到相关的快捷键设置, 因为操作习惯,想把CtrlC和CtrlV分别配置为复制和粘贴,其他的快捷键操作可以按照该方法进…...

AOP学习
corol调用serverce不在是直接调用的是调用底层代理对象,由代理对象统一帮我们处理 AOP常见概念 通知类型 切面顺序...

【ubuntu18.04】ubuntu18.04升级cmake-3.29.8及还原系统自带cmake操作说明
参考链接 cmake升级、更新(ubuntu18.04)-CSDN博客 升级cmake操作说明 下载链接 Download CMake 下载版本 下载软件包 cmake-3.30.3-linux-x86_64.tar.gz 拷贝软件包到虚拟机 cp /var/run/vmblock-fuse/blockdir/jrY8KS/cmake-3.29.8-linux-x86_64…...

利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简单集群(保姆教程)
文章目录 1、Mycat介绍1.1、mycat简介1.2、mycat重要概念1.3、Mycat1.x与Mycat2功能对比1.2、主从复制原理 2、前提准备3、集群规划4、安装和配置mysql主从复制4.1、master节点安装mysql8容器4.2、slave节点安装mysql8容器4.2、配置主从复制4.3、测试主从复制配置 5、安装mycat…...

算法——python实现堆排序
文章目录 堆排序二叉树堆堆排序的过程:代码实现python中的heapq模块 堆排序 二叉树 关于二叉树的操作,其实核心就是 父节点找子节点,子节点找父节点 如果要将二叉树存储到队列中,就需要找出 父子节点之间的规律: 父…...

uniapp-components(封装组件)
<myitem></myitem> 在其他类里面这样调用。...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...