数据结构与算法——二分查找与二叉排序树

文章目录

      • 1.预备知识
        • 1.1 题目目录
        • 1.2 二分查找
        • 1.3 递归二分查找
        • 1.4 循环二分查找
        • 1.5 二叉查找(排序)树
        • 1.6 二叉搜索树的代码实现
      • 2.搜索插入位置
        • 2.1 题目描述
        • 2.2 C++代码实现
      • 3.区间查找
        • 3.1 题目描述
        • 3.2 算法思路
        • 3.3 C++代码实现
      • 4.旋转数组查找
        • 4.1 题目描述
        • 4.2 解题思路
        • 4.3 C++代码实现
      • 5.序列化和反序列化二叉搜索树
        • 5.1 题目描述
        • 5.2 算法思路
        • 5.3 C++代码实现
      • 6.计算右侧小于当前元素的个数
        • 6.1 题目描述
        • 6.2 算法思路
        • 6.3 C++代码实现

1.预备知识

1.1 题目目录

在这里插入图片描述

1.2 二分查找

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

1.3 递归二分查找

bool binary_search(vector<int>& sort_array, int begin, int end, int target) {if (begin>end) {return false;}int mid = (begin + end) / 2;if (target == sort_array[mid]) {return true;}else if (target < sort_array[mid]) {binary_search(sort_array, begin, mid - 1, target);}else if (target > sort_array[mid]) {binary_search(sort_array, mid + 1, end, target);}
}

1.4 循环二分查找

bool binary_search(vector<int>& sort_array, int target) {int begin = 0;int end = sort_array.size() - 1;while (begin<=end) {int mid = (begin + end) / 2;if (target == sort_array[mid]) {return true;}else if(target < sort_array[mid]) {end = mid - 1;}else if (target > sort_array[mid]) {begin = mid + 1;}}return false;
}

1.5 二叉查找(排序)树

在这里插入图片描述
在这里插入图片描述

1.6 二叉搜索树的代码实现

1.二叉搜索树的插入

void solution::BST_insert(TreeNode* node, TreeNode* insert_node) {if (insert_node->val < node->val) {if (node->left) {BST_insert(node->left, insert_node);}else {node->left = insert_node;}}else {if (node->right) {BST_insert(node->right, insert_node);}else {node->right = insert_node;}}
}

2.二叉搜索树的搜索

bool solution::BST_search(TreeNode* node, int value) {if (value == node->val) {return true;}else if (value < node->val) {if (node->left) {BST_search(node->left, value);}else {return false;}}else if (value > node->val) {if (node->right) {BST_search(node->right, value);}else {return false;}}
}

2.搜索插入位置

2.1 题目描述

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

你可以假设数组中无重复元素。

2.2 C++代码实现

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

3.区间查找

3.1 题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

3.2 算法思路

在这里插入图片描述在这里插入图片描述

3.3 C++代码实现

class Solution {
public:int left_bound(vector<int>& nums,int target){int begin=0;int end=nums.size()-1;while(begin<=end){int mid=(begin+end)/2;if(target==nums[mid]){if(mid==0||target>nums[mid-1]){return mid;}end=mid-1;}else if(target<nums[mid]){end=mid-1;}else if(target>nums[mid]){begin=mid+1;}}return -1;}int right_bound(vector<int>& nums,int target){int begin=0;int end=nums.size()-1;while(begin<=end){int mid=(begin+end)/2;if(target==nums[mid]){if(mid==nums.size()-1||target<nums[mid+1]){return mid;}begin=mid+1;}else if(target<nums[mid]){end=mid-1;}else if(target>nums[mid]){begin=mid+1;}}return -1;}vector<int> searchRange(vector<int>& nums, int target) {int left=left_bound(nums,target);int right=right_bound(nums,target);vector<int> result;result.push_back(left);result.push_back(right);return result;}
};

4.旋转数组查找

4.1 题目描述

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

4.2 解题思路

在这里插入图片描述
在这里插入图片描述

4.3 C++代码实现

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

5.序列化和反序列化二叉搜索树

5.1 题目描述

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

编码的字符串应尽可能紧凑。

5.2 算法思路

在这里插入图片描述
在这里插入图片描述

5.3 C++代码实现

class Codec {
public:void BST_insert(TreeNode* node, TreeNode* insert_node) {if (insert_node->val < node->val) {if (node->left) {BST_insert(node->left, insert_node);}else {node->left = insert_node;}}else {if (node->right) {BST_insert(node->right, insert_node);}else {node->right = insert_node;}}}void change_int_to_string(int val, string& str_val) {string tmp;while (val) {tmp += val % 10 + '0';val = val / 10;}for (int i = tmp.length()- 1; i >= 0; i--) {str_val += tmp[i];}str_val += '#';}/*9.2 将二叉查找树按照前序遍历的方式,转化为字符串,数字之间使用#隔开*/void BST_preorder(TreeNode* node, string& data) {if (!node) {return;}string str_val;change_int_to_string(node->val, str_val);data += str_val;BST_preorder(node->left, data);BST_preorder(node->right, data);}// Encodes a tree to a single string.string serialize(TreeNode* root) {string data;BST_preorder(root,data);return data;   }// Decodes your encoded data to tree.TreeNode* deserialize(string data) {int val=0;vector<TreeNode*> node_vec;if(data.length()==0){return NULL;} for(int i=0;i<data.length();i++){if(data[i]=='#'){node_vec.push_back(new TreeNode(val));val=0;}else{val=val*10+(data[i]-'0');}}for(int i=1;i<node_vec.size();i++){BST_insert(node_vec[0],node_vec[i]);}return node_vec[0];}
};

6.计算右侧小于当前元素的个数

6.1 题目描述

给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

示例:
输入:nums = [5,2,6,1]
输出:[2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素

6.2 算法思路

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

6.3 C++代码实现

struct BSTNode{int val;int count;BSTNode* left;BSTNode* right;BSTNode(int x):val(x),count(0),left(NULL),right(NULL){}
};class Solution {
public:void BSTInsert(BSTNode* node,BSTNode* insert_node,int& count_small){if(insert_node->val<=node->val){node->count++;if(node->left){BSTInsert(node->left,insert_node,count_small);}else{node->left=insert_node;}}else{count_small+=node->count+1;if(node->right){BSTInsert(node->right,insert_node,count_small);}else{node->right=insert_node;}}}vector<int> countSmaller(vector<int>& nums) {vector<int> result;vector<int> count;vector<BSTNode*> node_vec;for(int i=nums.size()-1;i>=0;i--){node_vec.push_back(new BSTNode(nums[i]));}count.push_back(0);for(int i=1;i<node_vec.size();i++){int count_small=0;BSTInsert(node_vec[0],node_vec[i],count_small);count.push_back(count_small);}for(int i=node_vec.size()-1;i>=0;i--){delete node_vec[i];result.push_back(count[i]);}return result;}
};

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

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

相关文章

Django-C001-快速入门

此文章完成度【100%】留着以后忘记的回顾。多写多练多思考&#xff0c;我会努力写出有意思的demo&#xff0c;如果知识点有错误、误导&#xff0c;欢迎大家在评论处写下你的感想或者纠错。 Django Django是一个开放源码的Web应用框架&#xff0c;由Python写成&#xff0c;采用M…

Nature子刊:吃得越少,活得越久

来源&#xff1a;六六脑我们如何才能在年老体迈时保持健康和尽可能延长寿命&#xff1f;现在&#xff0c;研究衰老的科学家们已经给出了简单的答案&#xff1a;少吃点儿&#xff01;常言道&#xff0c;千金难买老来瘦。的确&#xff0c;经验与科学实验都告诉我们&#xff0c;成…

数据库高级知识——MySql锁机制

文章目录1.概述1.1 定义1.2 锁的分类2.三锁2.1 表锁(偏读)2.2 行锁(偏写)2.3 页锁1.概述 1.1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一…

最早的神经元从何而来?海绵基因图谱揭示神经系统起源

来源&#xff1a; 集智俱乐部作者&#xff1a;Viviane Callier译者&#xff1a;陈斯信 审校&#xff1a;梁金 编辑&#xff1a;邓一雪 导语海绵是动物生命演化树上最早的分支谱系之一&#xff0c;它们身体构造简单&#xff0c;却拥有许多与人类和其它复杂生物相同的基因。11月…

数据库高级知识——主从复制

文章目录1.复制的基本原理1.1 复制的原理和步骤2.复制的基本原则3.复制的最大问题4.一主一从常见配置4.1 主机修改my.ini配置文件4.2 从机修改my.cnf配置文件4.3 重启和关闭防火墙4.4 在Windows主机上建立帐户并授权slave4.5 在Linux从机上配置需要复制的主机4.6 关闭1.复制的基…

FrostSulliven最新发布引领全球增长的60大技术

来源&#xff1a;必达智库图片来源&#xff1a;网络沙利文特别推出“引领全球增长的60大技术”报告&#xff0c;该报告涵盖了环境与可持续发展、能源与公共事业、化学与新型材料、信息与通信技术、高端制造与自动化、传感器和仪器设备、健康领域、医疗器械与影响以及微电子等九…

GitHub基础——下载和上传

文章目录1.下载2.上传2.1 新建一个仓库2.2 上传2.3 拖拽1.下载 1.进入要下载的文件夹 2.右键&#xff0c;Git Bash Here&#xff0c;进入git bash 3.输入下载命令 19072LAPTOP-688SMNV8 MINGW64 /f/github download/设计模式 $ git clone https://github.com/rhyspang/CPP-De…

引导直觉解决数学猜想难题,DeepMind登上《Nature》封面

来源&#xff1a;机器之心编辑&#xff1a;nhyilin多年来&#xff0c;数学家们一直使用计算机来生成数据以帮助搜索数学模式&#xff0c;这种被称为实验数学的研究方法产生出许多重要的猜想&#xff0c;例如BSD猜想。虽然这种方法已经取得成功并且相当普遍&#xff0c;但从这些…

Centos6.5硬盘故障修复

以企业Centos6.5Linux为案例来修复系统&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;远程备份本地其他重要数据&#xff0c;出现只读文件系统&#xff0c;需要先备份其他重要数据基于rsync|scp远程备份&#xff0c;其中/data为源目录&#xff0c;/data/backup/2…

认知AI的兴起:2025年AI将会发生质的飞跃

来源&#xff1a; Gadi Singer自 1956 年 AI 的概念首次被提出&#xff0c;至今已有 60 多年的发展史。如今&#xff0c;随着相关理论和技术的不断革新&#xff0c;AI 在数据、算力和算法 “三要素” 的支撑下越来越多地走进我们的日常生活。但是&#xff0c;这一系列惊喜的背后…

不上市就等死?AI故事难讲,豪门盛宴背后的“血”与“泪”

图片来源&#xff1a;视觉中国来源&#xff1a;帮尼资讯 部分参考来源&#xff1a;福布斯中国、凤凰网财经、前瞻产业研究院&#xff0c;图片来源网络最近&#xff0c;商汤港股IPO终于迎来新进展。12月7日&#xff0c;商汤集团在香港启动公开发售。据悉&#xff0c;香港公开发售…

windows下搭建vue开发环境

安装node.js 包管理器 到官网 下载安装包直接默认安装&#xff0c;安装完成后验证是否正常安装。打开命令提示符&#xff1a; 输入node -v。 如果显示版本号则证明安装完成。安装vue 打开命令提示符输入&#xff1a; npm install vue全局安装 vue-cli npm install --global vue…

中科院发布11大领域171个热点和新兴前沿!有你的研究方向吗?

来源&#xff1a;科学网12月8日&#xff0c;中国科学院科技战略咨询研究院、中国科学院文献情报中心与科睿唯安联合向全球发布了《2021研究前沿》报告和《2021研究前沿热度指数》报告。《2021研究前沿》报告遴选展示了在农业科学、植物学和动物学&#xff0c;生态与环境科学&am…

Reparameterization Trick

目录 Sample() is not differentiableReparameterization trickToo ComplexSample() is not differentiable 现在我们得到的不是一个向量&#xff0c;得到的是一个分布&#xff0c;而分布是无法使用梯度下降的Reparameterization trick Too Complex 转载于:https://www.cnblogs…

DeepMind 打造 AI 游戏系统,可以玩扑克、国际象棋、围棋等,战斗力爆表

来源&#xff1a;AI科技大本营&#xff08;ID:rgznai100&#xff09;编译&#xff1a;禾木木谷歌母公司 Alphabet 的人工智能实验室 DeepMind 长期以来一直投资于游戏人工智能系统。实验室的理念是&#xff0c;游戏虽然缺乏明显的商业应用&#xff0c;但却是认知和推理能力的独…

OO第四单元——UML及其解析器——总结 暨 OO课程大总结

第四单元总结 第四单元主要内容是写代码解析UML&#xff0c;因此需要理解UML UML相关 starUML的储存方式是一个.mdj文件&#xff0c;通过使用文本编辑器观察这个文件&#xff0c;我们可以看出这是一个json格式储存的文件。 通过把.mdj后缀名改为.json&#xff0c;可以更加直观地…

Nature重要新发现:将运动小鼠的血液输入久坐小鼠中,可以改善大脑功能!

来源&#xff1a;生物通 斯坦福大学医学院的研究人员已经表明&#xff0c;大量锻炼的成年小鼠的血液对年龄相同、久坐不动的小鼠的大脑有益。运动小鼠血液中的一种蛋白质似乎是主要原因。Tony Wyss-Coray一项新的研究表明&#xff0c;有可能把跑马拉松的小鼠对大脑的好处转移到…

软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,debugging与test的思考与总结...

健壮性与正确性 健壮性与正确性是不同的——一个倾向于使程序尽可能保持运行&#xff0c;即使遇到错误&#xff0c;一个倾向于使程序尽可能正确&#xff0c;不在意保持运行 异常 异常分为两种——checked exception与unchecked exception 二者的区别在于&#xff1a; checked e…

地球系统科学简史:理解地球复杂性的多学科探索历程

来源&#xff1a;集智俱乐部作者&#xff1a;Will Steffen, Katherine Richardson等人 译者&#xff1a;晏丽 审校&#xff1a;张澳 编辑&#xff1a;邓一雪 导语我们的地球是一个有生命的有机体&#xff0c;不仅有大气、陆地、海洋之间的物理化学过程&#xff0c;生物也会对环…

数值微分

像这样的由全部变量的偏导数汇总而成的向量称为梯度&#xff08;gradient&#xff09;&#xff0c;梯度可以像下面这样来实现,这里使用的是用数值微分求梯度的方法。 def numerical_gradient(f, x):h 1e-4 # 0.0001grad np.zeros_like(x) # 生成和x形状相同的数组for idx in …