【优选算法】(第二十四篇)

news2026/4/2 3:40:07

目录

归并排序(medium)

题目解析

讲解算法原理

编写代码

数组中的逆序对(hard)

题目解析

讲解算法原理

编写代码


归并排序(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个整数数组nums,请你将该数组升序排列。
⽰例1:
输⼊:nums=[5,2,3,1]
输出:[1,2,3,5]
⽰例2:
输⼊:nums=[5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

讲解算法原理

解法(归并排序):
算法思路:

归并排序的流程充分的体现了「分⽽治之」的思想,⼤体过程分为两步:

◦ 分:将数组⼀分为⼆为两部分,⼀直分解到数组的⻓度为 1 ,使整个数组的排序过程被分为
「左半部分排序」+「右半部分排序」;
◦ 治:将两个较短的「有序数组合并成⼀个⻓的有序数组」,⼀直合并到最初的⻓度。

编写代码

c++算法代码:
 

class Solution
{
 vector<int> tmp;
public:
 vector<int> sortArray(vector<int>& nums) 
 {
 tmp.resize(nums.size());
 mergeSort(nums, 0, nums.size() - 1);
 return nums;
 }
 void mergeSort(vector<int>& nums, int left, int right)
 {
 if(left >= right) return;
 // 1. 选择中间点划分区间
 int mid = (left + right) >> 1;
 // [left, mid] [mid + 1, right]
 // 2. 把左右区间排序
 mergeSort(nums, left, mid);
 mergeSort(nums, mid + 1, right);
 // 3. 合并两个有序数组
 int cur1 = left, cur2 = mid + 1, i = 0;
 while(cur1 <= mid && cur2 <= right)
 tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : 
nums[cur2++];
 // 处理没有遍历完的数组
 while(cur1 <= mid) tmp[i++] = nums[cur1++];
 while(cur2 <= right) tmp[i++] = nums[cur2++];
 // 4. 还原
 for(int i = left; i <= right; i++)
 nums[i] = tmp[i - left];
 }
};

java算法代码:

class Solution
{
 int[] tmp;
 public int[] sortArray(int[] nums) 
 {
 tmp = new int[nums.length];
 mergeSort(nums, 0, nums.length - 1);
 return nums;
 }
 public void mergeSort(int[] nums, int left, int right)
 {
 if(left >= right) return;
 // 1. 根据中间点划分区间
 int mid = (left + right) / 2;
 // [left, mid] [mid + 1, right]
 // 2. 先把左右区间排个序
 mergeSort(nums, left, mid);
 mergeSort(nums, mid + 1, right);
 // 3. 合并两个有序数组
 int cur1 = left, cur2 = mid + 1, i = 0;
 while(cur1 <= mid && cur2 <= right)
 tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
 // 处理没有遍历完的数组
 while(cur1 <= mid) tmp[i++] = nums[cur1++];
 while(cur2 <= right) tmp[i++] = nums[cur2++];
 // 4. 还原
 for(int j = left; j <= right; j++) 
 nums[j] = tmp[j - left];
 }
}

数组中的逆序对(hard)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

在数组中的两个数字,如果前⾯⼀个数字⼤于后⾯的数字,则这两个数字组成⼀个逆序对。输⼊⼀个数组,求出这个数组中的逆序对的总数。
⽰例1:
输⼊:[7,5,6,4]输出:5

讲解算法原理

解法(利⽤归并排序的过程---分治):算法思路:
⽤归并排序求逆序数是很经典的⽅法,主要就是在归并排序的合并过程中统计出逆序对的数量,也就是在合并两个有序序列的过程中,能够快速求出逆序对的数量。
我们将这个问题分解成⼏个⼩问题,逐⼀破解这道题。
注意:默认都是升序,如果掌握升序的话,降序的归并过程也是可以解决问题的。• 先解决第⼀个问题,为什么可以利⽤归并排序?
如果我们将数组从中间划分成两个部分,那么我们可以将逆序对产⽣的⽅式划分成三组:• 逆序对中两个元素:全部从左数组中选择
• 逆序对中两个元素:全部从右数组中选择• 逆序对中两个元素:⼀个选左数组另⼀个选右数组根据排列组合的分类相加原理,三种种情况下产⽣的逆序对的总和,正好等于总的逆序对数量。
⽽这个思路正好匹配归并排序的过程:• 先排序左数组;
• 再排序右数组;• 左数组和右数组合⼆为⼀。
因此,我们可以利⽤归并排序的过程,先求出左半数组中逆序对的数量,再求出右半数组中逆序对的数量,最后求出⼀个选择左边,另⼀个选择右边情况下逆序对的数量,三者相加即可。
• 解决第⼆个问题,为什么要这么做?在归并排序合并的过程中,我们得到的是两个有序的数组。我们是可以利⽤数组的有序性,快速统计
出逆序对的数量,⽽不是将所有情况都枚举出来。
• 最核⼼的问题,如何在合并两个有序数组的过程中,统计出逆序对的数量?合并两个有序序列时求逆序对的⽅法有两种:
1. 快速统计出某个数前⾯有多少个数⽐它⼤;2. 快速统计出某个数后⾯有多少个数⽐它⼩;
⽅法⼀:快速统计出某个数前⾯有多少个数⽐它⼤通过⼀个⽰例来演⽰⽅法⼀:

假定已经有两个已经有序的序列以及辅助数组left=[5,7,9]right=[4,5,8]help=[],通过合并两个有序数组的过程,来求得逆序对的数量:
规定如下定义来叙述过程:
cur1遍历left数组,cur2遍历right数组ret记录逆序对的数量
第⼀轮循环:
left[cur1]>right[cur2],由于两个数组都是升序的,那么我们可以断定,此刻left数组中[cur1,2]区间内的3个元素均可与right[cur2]的元素构成逆序对,因此可以累加逆序对的数量ret+=3,并且将right[cur2]加⼊到辅助数组中,cur2++遍历下⼀个元素。
第⼀轮循环结束后:left=[5,7,9]right=[x,5,8]help=[4]ret=3cur1=0cur2=1
第⼆轮循环:
left[cur1]==right[cur2],因为right[cur2]可能与left数组中往后的元素构成逆序对,因此我们需要将left[cur1]加⼊到辅助数组中去,此时没有产⽣逆序对,不更新ret。
第⼆轮循环结束后:left=[x,7,9]right=[x,5,8]help=[4,5]ret=3cur1=1cur2=1
第三轮循环:
left[cur1]>right[cur2],与第⼀轮循环相同,此刻left数组中[cur1,2]区间内的2个元素均可与right[cur2]的元素构成逆序对,更新ret的值为ret+=2,并且将right[cur2]加⼊到辅助数组中去,cur2++遍历下⼀个元素。
第三轮循环结束后:left=[x,7,9]right=[x,x,8]help=[4,5,5]ret=5cur1=1cur2=2
第四轮循环:
left[cur1]<right[cur2],由于两个数组都是升序的,因此我们可以确定left[cur1]⽐right数组中的所有元素都要⼩。left[cur1]这个元素是不可能与right数组中的元素构成逆序对。因此,⼤胆
的将left[cur1]这个元素加⼊到辅助数组中去,不更细ret的值。第四轮循环结束后:left=[x,x,9]right=[x,x,8]help=[4,5,5,7]ret=5cur1=2cur2=2
第五轮循环:
left[cur1]>right[cur2],与第⼀、第三轮循环相同。此时left数组内的1个元素能与right[cur2]构成逆序对,更新ret的值,并且将right[cur2]加⼊到辅助数组中去。
第五轮循环结束后:left=[x,x,9]right=[x,x,x]help=[4,5,5,7,8]ret=6cur1=2cur2=2
处理剩余元素:• 如果是左边出现剩余,说明左边剩下的所有元素都是⽐右边元素⼤的,但是它们都是已经被计算过
的(我们以右边的元素为基准的),因此不会产⽣逆序对,仅需归并排序即可。• 如果是右边出现剩余,说明右边剩下的元素都是⽐左边⼤的,不符合逆序对的定义,因此也不需要
处理,仅需归并排序即可。
整个过程只需将两个数组遍历⼀遍即可,时间复杂度为O(N)。由上述过程我们可以得出⽅法⼀统计逆序对的关键点:
在合并有序数组的时候,遇到左数组当前元素>右数组当前元素时,我们可以通过计算左数组中剩余元素的⻓度,就可快速求出右数组当前元素前⾯有多少个数⽐它⼤,对⽐解法⼀中⼀个⼀个枚举逆序对效率快了许多。
⽅法⼆:快速统计出某个数后⾯有多少个数⽐它⼩依旧通过⼀个⽰例来演⽰⽅法⼆:
假定已经有两个已经有序的序列以及辅助数组left=[5,7,9]right=[4,5,8]help=[],通过合并两个有序数组的过程,来求得逆序对的数量:
规定如下定义来叙述过程:
cur1遍历left数组,cur2遍历right数组ret记录逆序对的数量
第⼀轮循环:
left[cur1]>right[cur2],先不要着急统计,因为我们要找的是当前元素后⾯有多少⽐它⼩的,这⾥虽然出现了⼀个,但是right数组中依旧还可能有其余⽐它⼩的。因此此时仅将right[cur2]加⼊到辅助数组中去,并且将cur2++。
第⼀轮循环结束后:left=[5,7,9]right=[x,5,8]help=[4]ret=0cur1=0cur2=1
第⼆轮循环:
left[cur1]==right[cur2],由于两个数组都是升序,这个时候对于元素left[cur1]来说,我们已经可以断定right数组中[0,cur2)左闭右开区间上的元素都是⽐它⼩的。因此此时可以统计逆序对的数量ret+=cur2-0,并且将left[cur1]放⼊到辅助数组中去,cur1++遍历下⼀个元素。
第⼆轮循环结束后:left=[x,7,9]right=[x,5,8]help=[4,5]ret=1cur1=1cur2=1
第三轮循环:
left[cur1]>right[cur2],与第⼀轮循环相同,直接将right[cur2]加⼊到辅助数组中去,cur2++遍历下⼀个元素。
第三轮循环结束后:left=[x,7,9]right=[x,x,8]help=[4,5,5]ret=1cur1=1cur2=2
第四轮循环:
left[cur1]<right[cur2],由于两个数组都是升序的,这个时候对于元素left[cur1]来说,我们依旧已经可以断定right数组中[0,cur2)左闭右开区间上的元素都是⽐它⼩的。因此此时可以统计逆序对的数量ret+=cur2-0,并且将left[cur1]放⼊到辅助数组中去,cur1++遍历下⼀个元素。
第四轮循环结束后:left=[9]right=[8]help=[4,5,5,7]ret=3cur1=2cur2=2
第五轮循环:
left[cur1]>right[cur2],与第⼀、第三轮循环相同。直接将right[cur2]加⼊到辅助数组中去,cur2++遍历下⼀个元素。
第五轮循环结束后:left=[x,x,9]right=[x,x,x]help=[4,5,5,7,8]ret=3cur1=2cur2=2
处理剩余元素:• 如果是左边出现剩余,说明左边剩下的所有元素都是⽐右边元素⼤的,但是相⽐较于⽅法⼀,逆序
对的数量是没有统计过的。因此,我们需要统计ret的值:
◦ 设左边数组剩余元素的个数为leave◦ ret+=leave*(cur2-0)
对于本题来说,处理剩余元素的时候,left数组剩余1个元素,cur2-0=3,因此ret需要类加上3,结果为6。与⽅法⼀求得的结果相同。
• 如果是右边出现剩余,说明右边剩下的元素都是⽐左边⼤的,不符合逆序对的定义,因此也不需要处理,仅需归并排序即可。
整个过程只需将两个数组遍历⼀遍即可,时间复杂度依旧为O(N)。
由上述过程我们可以得出⽅法⼆统计逆序对的关键点:
在合并有序数组的时候,遇到左数组当前元素<=右数组当前元素时,我们可以通过计算右数组已经遍历过的元素的⻓度,快速求出左数组当前元素后⾯有多少个数⽐它⼤。
但是需要注意的是,在处理剩余元素的时候,⽅法⼆还需要统计逆序对的数量。

编写代码
升序的版本

c++算法代码:

class Solution
{
 int tmp[50010];
public:
 int reversePairs(vector<int>& nums) 
 {
 return mergeSort(nums, 0, nums.size() - 1);
 }
 int mergeSort(vector<int>& nums, int left, int right)
 {
 if(left >= right) return 0;
 int ret = 0;
 // 1. 找中间点,将数组分成两部分
 int mid = (left + right) >> 1;
 // [left, mid][mid + 1, right]
 // 2. 左边的个数 + 排序 + 右边的个数 + 排序
 ret += mergeSort(nums, left, mid);
 ret += mergeSort(nums, mid + 1, right);
 // 3. ⼀左⼀右的个数
 int cur1 = left, cur2 = mid + 1, i = 0;
 while(cur1 <= mid && cur2 <= right) // 升序的时候 {
 if(nums[cur1] <= nums[cur2])
 {
 tmp[i++] = nums[cur1++];
 }
 else
 {
 ret += mid - cur1 + 1;
 tmp[i++] = nums[cur2++];
 }
 }
 // 4. 处理⼀下排序
 while(cur1 <= mid) tmp[i++] = nums[cur1++];
 while(cur2 <= right) tmp[i++] = nums[cur2++];
 for(int j = left; j <= right; j++)
 nums[j] = tmp[j - left];
 
 return ret;
 }
};

java算法代码:

class Solution
{ 
 int[] tmp;
 public int reversePairs(int[] nums) 
 {
 int n = nums.length;
 tmp = new int[n];
 return mergeSort(nums, 0, n - 1);
 }
 public int mergeSort(int[] nums, int left, int right)
 {
 if(left >= right) return 0;
 int ret = 0;
 // 1. 选择⼀个中间点,将数组划分成两部分
 int mid = (left + right) / 2;
 // [left, mid] [mid + 1, right]
 // 2. 左半部分的个数 + 排序 + 右半部分的个数 + 排序 ret += mergeSort(nums, left, mid);
 ret += mergeSort(nums, mid + 1, right);
 // 3. ⼀左⼀右的个数
 int cur1 = left, cur2 = mid + 1, i = 0;
 while(cur1 <= mid && cur2 <= right) // 升序版本 {
 if(nums[cur1] <= nums[cur2])
 {
 tmp[i++] = nums[cur1++];
 }
 else
 {
 ret += mid - cur1 + 1;
 tmp[i++] = nums[cur2++];
 }
 }
 // 4. 处理⼀下排序
 while(cur1 <= mid) tmp[i++] = nums[cur1++];
 while(cur2 <= right) tmp[i++] = nums[cur2++];
 for(int j = left; j <= right; j++)
 nums[j] = tmp[j - left];
 
 return ret;
 }
}
降序的版本

c++算法代码:

class Solution
{
 int tmp[50010];
public:
 int reversePairs(vector<int>& nums) 
 {
 return mergeSort(nums, 0, nums.size() - 1);
 }
 int mergeSort(vector<int>& nums, int left, int right)
 {
 if(left >= right) return 0;
 int ret = 0;
 // 1. 找中间点,将数组分成两部分
 int mid = (left + right) >> 1;
 // [left, mid][mid + 1, right]
 // 2. 左边的个数 + 排序 + 右边的个数 + 排序
 ret += mergeSort(nums, left, mid);
 ret += mergeSort(nums, mid + 1, right);
 // 3. ⼀左⼀右的个数
 int cur1 = left, cur2 = mid + 1, i = 0;
 while(cur1 <= mid && cur2 <= right) // 降序的版本 {
 if(nums[cur1] <= nums[cur2])
 {
 tmp[i++] = nums[cur2++];
 }
 else
 {
 ret += right - cur2 + 1;
 tmp[i++] = nums[cur1++];
 }
 }
 // 4. 处理⼀下排序
 while(cur1 <= mid) tmp[i++] = nums[cur1++];
 while(cur2 <= right) tmp[i++] = nums[cur2++];
 for(int j = left; j <= right; j++)
 nums[j] = tmp[j - left];
 
 return ret;
 }
};

java算法代码:

class Solution
{ 
 int[] tmp;
 public int reversePairs(int[] nums) 
 {
 int n = nums.length;
 tmp = new int[n];
 return mergeSort(nums, 0, n - 1);
 }
 public int mergeSort(int[] nums, int left, int right)
 {
 if(left >= right) return 0;
 int ret = 0;
 // 1. 选择⼀个中间点,将数组划分成两部分
 int mid = (left + right) / 2;
 // [left, mid] [mid + 1, right]
 // 2. 左半部分的个数 + 排序 + 右半部分的个数 + 排序 ret += mergeSort(nums, left, mid);
 ret += mergeSort(nums, mid + 1, right);
 // 3. ⼀左⼀右的个数
 int cur1 = left, cur2 = mid + 1, i = 0;
 while(cur1 <= mid && cur2 <= right) // 降序的版本 {
 if(nums[cur1] <= nums[cur2])
 {
 tmp[i++] = nums[cur2++];
 }
 else
 {
 ret += right - cur2 + 1;
 tmp[i++] = nums[cur1++];
 }
 }
 // 4. 处理⼀下排序
 while(cur1 <= mid) tmp[i++] = nums[cur1++];
 while(cur2 <= right) tmp[i++] = nums[cur2++];
 for(int j = left; j <= right; j++)
 nums[j] = tmp[j - left];
 
 return ret;
 }
}

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

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

相关文章

[MASM] masm32的下载及详细安装使用过程(附有下载文件)

目录 下载 配置环境 编译 链接 masm的安装和环境配置 下载链接在文末 下载 下载安装包后复制到虚拟机win7系统的桌面 win7安装到虚拟机的步骤&#xff1a; [win7] win7系统的下载及在虚拟机中详细安装过程&#xff08;附有下载文件&#xff09;-CSDN博客 双击压缩包&…

微信消息转发(微信消息转发方案的取舍)

机构可能会有很多的粉丝群&#xff0c;老师有很多家长群&#xff0c;比如发送通知 如果一个个的群发送那么就很繁琐。所以就有一键群发的需求。只需要在一个群发送内容主动同步到其他群。 微信消息转发方案取舍 方案1. 因为微信有本地数据库SQLite&#xff0c; 消息会保存到本…

Redis安装RedisBloom插件

Redis安装RedisBloom插件 1. 下载RedisBloom2. 安装RedisBloom3. Redis 安装RedisBloom4. 验证是否安装成功5. 其他安装方法5.1 使用 Docker 安装 RedisBloom5.2 通过 RedisStack 安装 RedisBloom 是一个 Redis 模块&#xff0c;它提供了一种高效的方式来存储和检索大数据集中的…

频繁full gc问题排查及解决

为什么我们要对频繁full gc的情况进行处理---》频繁full gc会导致stw&#xff0c;影响用户体验。 &#xff08;1&#xff09;先进行问题的排查 如果频繁full gc 会报警&#xff0c;公司有自己的监控平台&#xff0c;可以查看full gc的情况 如果公司没有自己的监控平台&#…

爬虫案例——爬取情话网数据

需求&#xff1a; 1.爬取情话网站中表白里面的所有句子&#xff08;表白词_表白的话_表白句子情话大全_情话网&#xff09; 2.利用XPath来进行解析 3.使用面向对象形发请求——创建一个类 4.将爬取下来的数据保存在数据库中 写出对应解析语法 //div[class"box labelbo…

【实战篇】自增主键为什么不是连续的?

背景 由于自增主键可以让主键索引尽量地保持递增顺序插入&#xff0c;避免了页分裂&#xff0c;因此索引更紧凑。 之前我见过有的业务设计依赖于自增主键的连续性&#xff0c;也就是说&#xff0c;这个设计假设自增主键是连续的。但实际上&#xff0c;这样的假设是错的&#…

Linux高阶——Github本地仓库与云端仓库关联

1、安装代理软件 steam 选择Github和系统代理模式&#xff0c;一键加速即可 2、 安装Git 3、访问Github网站&#xff0c;创建新用户 4、Github探索 &#xff08;1&#xff09;Explore探索标签 &#xff08;2&#xff09;工程结构 用户名/仓库名 自述文件&#xff0c;用markdo…

C语言复习概要(三)

本文 使用Visual Studio进行调试的技巧与函数递归详解1. 引言2. Visual Studio 调试技巧2.1. 断点的使用2.1.1. 基本断点示例&#xff1a;设置基本断点 2.1.2. 条件断点示例&#xff1a;条件断点 2.2. 逐步执行代码示例&#xff1a;逐步执行代码 2.3. 监视变量使用监视窗口 2.4…

希捷8T硬盘exfat变0字节的恢复方法

最近流行的3.5寸大容量台式硬盘移动盒子是一种性价比较高的组合&#xff0c;为了方便如涉及到跨平台&#xff08;win和mac&#xff09;&#xff0c;大多数此类组合选择了exfat文件系统。下边这个案例就是我们经常遇到的exfat变0字节。 故障存储: ST8000HKVS002 8T/exfat 文件…

STM32F407 HAL库单通道ADC采集并串口打印电压值

本文将介绍如何使用STM32F407的HAL库实现单通道ADC采集&#xff0c;并通过串口将采集到的电压值打印出来。具体地&#xff0c;我们将使用ADC1读取通道5&#xff08;对应引脚PA5&#xff09;&#xff0c;并将转换后的电压值用串口1发送到串口助手上进行显示。 一、开发环境 硬件…

类和对象的学习1

类和对象的学习1 [TOC](类和对象的学习1一、类的定义1.类定义格式2.访问限定符 二、实例对象1.实例3.对象大小4. this指针5.⾯向对象三⼤特性“封装、继承、多态”中的封装) 一、类的定义 1.类定义格式 1.1 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中…

第十五周周报

目录 摘要Abstract1 LSTM模型实战1.1 数据处理1.2 LSTM模型的搭建1.3 数据的预测和可视化 2 transformer&#xff08;上&#xff09;2.1 Transformer 结构2.2 Transformer 编码器 总结 摘要 本周的工作内容主要分为两个部分&#xff0c;第一部分是使用LSTM模型预测股票市场数据…

Python(八)-异常

目录 什么是异常 快速入门异常 常见的异常类型 常见处理方式 捕获一个指定异常 捕获多个异常 捕获所有的异常 异常的其他关键字 异常具有传递性 什么是异常 异常指的是Python程序发生的不正常事件。 有时候&#xff0c;异常可称为错误。 当检测到一个错误时&#x…

CPU飙高如何处理?

测试人员在压测的时候&#xff0c;会对应用进行测试&#xff0c;这个时候会查看cpu、内存、load、rt、qps等指标 CPU利用率是来描述CPU的使用情况的&#xff0c;表明了一段时间内CPU被占用的情况。使用率越高&#xff0c;说明机器在这个时间上运行了很多程序。 如何进行问题定…

codetop标签树刷题(四)!!暴打面试官!!!!

用于个人复习 1.二叉树的右视图2.二叉树最大宽度3.二叉树的最大深度4.N叉树的最大深度5.二叉树的最小深度6.子树的最大平均值7.求根节点到叶节点的数字之和8.另一棵树的子树9.对称二叉树 1.二叉树的右视图 给定一个二叉树的根节点root&#xff0c;想象自己站在它的右侧&#x…

麒麟操作系统如何识别提取图片中的文字

在工作、学习中&#xff0c;我们经常会需要从图片中提取文字&#xff0c;在手机上或其它操作系统上&#xff0c;有各种方法。本书中&#xff0c;我们介绍麒麟操作系统提取图片中文字的方法。 首先准备好自己需要的文档截图&#xff0c;把不需要的部分裁掉&#xff0c;以免影响…

电容笔值得买吗?2024精选盘点推荐五大惊艳平替电容笔!

电容笔还是很值得买的&#xff0c;不管是对于日常书写&#xff0c;简单笔记&#xff0c;还是绘画等场景而言&#xff0c;选择一款性价比高的平替电容笔都能提升生产力。可是现在市面上的品牌很多&#xff0c;该如何挑选最适合自己的电容笔呢&#xff1f;不用着急&#xff0c;我…

【AIGC半月报】AIGC大模型启元:2024.10(上)

【AIGC半月报】AIGC大模型启元&#xff1a;2024.10&#xff08;上&#xff09; (1) YOLO11&#xff08;Ultralytics新作&#xff09; (1) YOLO11&#xff08;Ultralytics新作&#xff09; 2024.10.01 Ultralytics在 YOLO Vision 2024 活动上宣布发布其新的计算机视觉模型 YOLO…

千元级体验--希亦ACE迷你洗衣机测评分享,宝妈必备的性价比好物

​小孩子的衣物是不建议和大人衣物一起洗的&#xff0c;一方面是他们的免疫力比较低下&#xff0c;如果和大人混杂各种污渍病菌一起洗的话&#xff0c;容易有感染细菌的可能。而另一方面&#xff0c;小孩子特别是女婴的衣物&#xff0c;更要仔细注意&#xff0c;因为大人的衣物…

ad.concat()学习

学习1 import anndata as ad, pandas as pd, numpy as np from scipy import sparse a ad.AnnData(Xsparse.csr_matrix(np.array([[0, 1], [2, 3]])),obspd.DataFrame({"group": ["a", "b"]}, index["s1", "s2"]),varpd.D…