单细胞系列教程:质控(四)

学习目标

知道如何导入和读取数据,并了解数据的质控,能够对数据进行质控和分析。

1. 质控准备

在基因表达定量后,需要将这些数据导入到 R 中,以生成用于执行 QC(质控)。下面将讨论定量数据的格式,以及如何将其导入 R,以便可以继续工作流程中的 QC 步骤。

2. 数据来源

在本教程中,将使用scRNA-seq 数据集,该数据集是 Kang 等人 2017 年一项大规模研究的一部分。在本文中,作者提出了一种算法,该算法利用遗传变异 (eQTL) 来确定每个包含单个细胞的液滴 (singlet) 的遗传身份,并识别包含来自不同个体的两个细胞的液滴 (doublet)。

用于测试他们算法的数据取自八名狼疮患者的外周血单核细胞 (PBMC) 组成,分为对照和干扰素 β 治疗(刺激)条件。

  • Raw data

该数据集在 GEO (GSE96583) 上可下载,但是可用的计数矩阵缺少线粒体读数,因此从SRA (SRP102802) 下载了 BAM 文件。这些 BAM 文件被转换回 FASTQ 文件,然后通过 Cell Ranger 运行以获得将使用的计数数据。

注意:此数据集的计数数据也可从 10X Genomics 获得,并在 Seurat 教程中使用。

  • Metadata

除了原始数据,还需要收集有关数据的信息;这称为Metadata。常常有一种直接放手去做的冲动,但如果对这些数据的来源样本一无所知,这并不是一个好的习惯。

下面提供了数据集的一些相关Metadata

  1. 文库是使用 10X Genomics 第 2 版制备的
  2. 样本在 Illumina NextSeq 500 上进行测序
  3. 来自八名狼疮患者的 PBMC 样本被分成两个等分试样
    • 一份 PBMC 被 100 U/mL 重组 IFN-β 激活 6 小时。
    • 第二个等分样未处理。
    • 6 小时后,将每种条件的 8 个样品汇集到两个池中。
  4. 分别鉴定了 12,138 和 12,167 个细胞,用于对照和刺激的合并样本。
  5. 由于样本是 PBMC,预计包含免疫细胞,例如:
    • B细胞
    • T细胞
    • NK细胞
    • 单核细胞
    • 巨噬细胞
    • 巨核细胞(可能)

推荐在质控或分析前,对自己的样本有充分的了解,这对于后续的分析十分有帮助。

3. 数据准备

  • 环境准备:> 参考文末往期推荐
  • 数据下载:> 数据地址

4. 项目结构

涉及大量数据的研究中,最重要的部分之一是如何管理它。倾向于优先分析,但数据管理的许多其他重要方面,往往在第一次看到新数据中被忽视。哈佛大学的生物医学数据管理 很好的讲述了这一过程。

数据管理的一个重要方面是组织。对于处理和分析数据的每个实验,通过创建计划的存储空间(目录结构)来组织被认为是最佳实践。

  • 创建目录结构
single_cell_rnaseq/
├── data
├── results
└── figures

5. 数据处理

  • 新建Rscript
touch quality_control.R
  • 加载包
# 在前面创建的脚本中,用R打开
library(SingleCellExperiment)
library(Seurat)
library(tidyverse)
library(Matrix)
library(scales)
library(cowplot)
library(RCurl)
  • 加载scRNA-seq count数据

无论用于处理原始scRNA-seq 序列数据的技术或管道如何,定量后表达数据的输出通常是相同的。也就是说,对于每个单独的样本,将拥有以下三个文件:

  1. 具有细胞ID的文件,代表所有定量的细胞
  2. 具有基因ID的文件,代表所有定量的基因
  3. 每个细胞的每个基因的计数矩阵

以上数据存放在data/ctrl_raw_feature_bc_matrix文件夹内。

  1. barcodes.tsv

这是一个文本文件,其中包含该样本的所有细胞条形码。条形码按矩阵文件中显示的数据顺序列出

  1. features.tsv

这是一个包含定量基因标识符的文本文件。标识符的来源可能是 Ensembl、NCBI、UCSC,但大多数情况下这些是官方基因符号。这些基因的顺序对应于矩阵文件中的行顺序。

  1. matrix.mtx

这是一个包含计数值矩阵的文本文件。行与上面的基因 ID 相关联,列对应于细胞条形码。请注意,此矩阵中有许多零值。

将此数据加载到 R 中,需要将这三个数据整合为一个计数矩阵,并且考虑到减少计算的原因,此计数矩阵是一个稀疏矩阵。

  • 不同的读取数据方法:
  1. readMM(): 这个函数来自 Matrix 包,它将标准矩阵转换为稀疏矩阵。 features.tsv 文件和barcodes.tsv 必须先单独加载到R 中,然后才能将它们组合起来。
  2. Read10X(): 此函数来自 Seurat 包,将直接使用 Cell Ranger 输出目录作为输入。使用这种方法,不需要加载单个文件,而是该函数将加载并将它们组合成一个稀疏矩阵。本文将采取这个办法。

使用 Cell Ranger 处理 10X数据后,将拥有一个 outs目录。在此目录中,有下列文件:

  1. web_summary.html: 报告不同的 QC 指标,包括映射指标、过滤阈值、过滤后估计的细胞数,以及过滤后每个细胞的读数和基因数量的信息。
  2. BAM alignment files: 用于可视化映射读取和重新创建FASTQ文件的文件(如果需要)
  3. filtered_feature_bc_matrix:包含使用 Cell Ranger 过滤的数据构建计数矩阵所需的所有文件的文件夹
  4. raw_feature_bc_matrix: 包含使用原始未过滤数据构建计数矩阵所需的所有文件的文件夹

虽然Cell Ranger 对表达计数执行过滤,但希望执行自己的 QC 和过滤。鉴于此,只对 Cell Ranger 输出中的 raw_feature_bc_matrix文件夹感兴趣。

如果有一个样本,可以生成计数矩阵,然后创建一个 Seurat 对象:

关于Seurat对象

# 如何读取单个样本的 10X 数据(输出为稀疏矩阵)
ctrl_counts <- Read10X(data.dir = "data/ctrl_raw_feature_bc_matrix")

# 将计数矩阵转为 Seurat 对象
ctrl <- CreateSeuratObject(counts = ctrl_counts, min.features = 100)
# min.features 参数指定每个细胞需要检测的最小基因数。

min.features 参数将过滤掉质量差的细胞,这些细胞可能只是封装了随机条形码而没有任何细胞存在。通常,检测到的基因少于 100 个的细胞不被考虑用于分析。

当使用 Read10X()函数读入数据时,Seurat会自动为每个单元格创建一些元数据。此信息存储在Seurat对象内的 meta.data中。

# 探索元数据
head(ctrl@meta.data)

元数据的列:

  • orig.ident: 如果已知,这通常包含样本标识,但默认为“SeuratProject
  • nCount_RNA: 每个单元格的 UMI
  • nFeature_RNA: 每个细胞检测到的基因数量
  • 使用 for 循环读取多个样本

在实践中,可能有几个样本需要读取数据,如果一次只读取一个,可能会变得乏味且容易出错。因此,为了使数据导入R更有效,可以使用 for循环,它将为给定的每个输入迭代一系列命令,并为每个样本创建 seurat对象。

# 仅测试,无法运行。
for (variable in input){
	command1
	command2
	command3
}


# 利用循环读取数据
for (file in c("ctrl_raw_feature_bc_matrix", "stim_raw_feature_bc_matrix")){
        seurat_data <- Read10X(data.dir = paste0("data/", file))
        seurat_obj <- CreateSeuratObject(counts = seurat_data, 
                                         min.features = 100, 
                                         project = file)
        assign(file, seurat_obj)  # 将对象赋值给变量
}

接下来,将这些对象合并到一个单独的 Seurat 对象中。这将使两个样品组一起运行 QC 步骤变得更加容易,并能够轻松地比较所有样品的数据质量。

# 创建一个合并的 Seurat 对象
merged_seurat <- merge(x = ctrl_raw_feature_bc_matrix, 
                       y = stim_raw_feature_bc_matrix, 
                       add.cell.id = c("ctrl", "stim"))

# 合并两个以上的样本
merged_seurat <- merge(x = ctrl_raw_feature_bc_matrix, 
                       y = c(stim1_raw_feature_bc_matrix, stim2_raw_feature_bc_matrix,
                       stim3_raw_feature_bc_matrix), 
                       add.cell.id = c("ctrl", "stim1", "stim2", "stim3"))

# 查看对象的元数据
head(merged_seurat@meta.data)
tail(merged_seurat@meta.data)

因为相同的单元格 ID 可用于不同的样本,所以使用add.cell.id参数为每个单元格 ID 添加一个特定于样本的前缀。

本文转载于网络 如有侵权请联系删除

相关文章

  • 使用 mock 数据在本地运行 SAP Fiori Elements 应用的工作原理

    本系列的前两篇文章:在没有任何前端开发经验的基础上,创建第一个SAPFioriElements应用如何使用mock数据在本地运行SAPFioriElements本文研究FioriElements应用本地运行,而不是连接远程数据库,消费服务器OData服务的工作原理。本地运行SAPFioriElements应用时,访问的index.html为:test文件夹下的flpSandboxMockServer.html这个id为sap-ui-bootstrap的script标签里,定义了SAPUI5bootstrap需要加载的JavaScriptResource文件:这个scriptdata-sap-ui-use-mockserver标签里,定义了为true:使用mockserver的标志位,在locate-reuse-libs.js里被访问。在callback里执行mockserver的init操作。在mock模式下运行,metadata的url也指向本地xml文件了:mockserverurl:/sap/opu/odata/sap/SEPMRA_PROD_MAN/和正常模式下运行的OData

  • Ubuntu 用户安装 Pf-Kernel 3.14 内核

    Pf-Kernel是LinuxKernel的分支,是LinuxKernel的更新版本,提供很多很有用的特性,例如bfs调度器,PF内核调度器,用于提高磁盘管理补丁,总之就是对原内核的更新和补丁。可用的最新版本是PFKernel3.14,基于3.14内核。没有PPA,使用下载DEB安装包进行安装。32位Ubuntu及衍生版本系统用户安装下载DEB安装包,终端输入以下命令:wgetftp://big-bum.uni.cx/pf-kernel/i386/linux-headers-3.14.0-pf1+_3.14.0-pf1+-10.00.Custom_i386.debwgetftp://big-bum.uni.cx/pf-kernel/i386/linux-image-3.14.0-pf1+_3.14.0-pf1+-10.00.Custom_i386.deb安装命令:sudodpkg-ilinux-headers-3.14.0-pf1*linux-image-3.14.0-pf1*卸载命令:sudoapt-getremovelinux-headers-3.14.0-pf1*linux-im

  • 五分钟学会工厂模式,大大提升你的协作效率!

    点击上方蓝字,关注并星标,和我一起学技术。大家好,在上篇文章当中我们给大家分享了抽象工厂这个设计模式。在介绍抽象工厂的时候,我们也对比了和工厂模式的区别,所以今天我们来看一下工厂模式的工作原理。工厂模式工厂模式的原理我们之前也曾经简单提到过,它的目的非常简单,就是把多个类的复杂初始化逻辑进行封装。通过简单的参数来控制创建的实例,对于使用者来说,不必关心创建当中的逻辑,而只需要关注参数就可以了。其实和我们生活当中的工厂是非常类似的,对于每一家工厂而言,零件的生产过程是非常繁琐的。但是进料则要简单得多,比如钢铁厂的进料可能就只有铁矿石,一些器件厂的进料可能就只有钢材。在工厂模式当中呢,简单的进料指的是工厂传入的参数,而工厂的产品对应某一个类的实例。实现代码严格说起来工厂模式有两种实现方式,一种是通过类实现,我们通过创建工厂类实例或者是调用工厂类当中的静态方法来创建我们需要的实例。还有一种方式是通过函数实现,效果是一样的。这两者的区别在于通过类的方式我们可以定义更多的参数以及更多的步骤,比如我们可以在工厂类初始化的时候加入更多的过程。而函数则适用于比较简单的创建逻辑,只需要简单的参数和过程就

  • 【Rust日报】2020-12-19 Niko的2020年度总结,wasm-2048

    Niko的2020年度总结这是Niko从个人角度对2020的年度总结,其中回顾了他这一年参与的各种计划,有效的和无效的,以及其对于明年的意义。TL;DR流程与治理重大变更流程帮助编译器团队将更多时间用于设计Lang团队的项目提案有希望,但是仍在进展中WIPLang团队的待办事项Bonanza很棒,应该继续我认为"基金会对话"(The"FoundationConversation")是一个有趣的模版基金会非常令人兴奋技术工作从事RFC2229(“不相交闭包捕获”)的小组很棒const泛型的MVP很棒,我们应该做更多Polonius的Sprint是一个很好的模版,我们需要更多的SprintChalk项目和共享类型库的设计ffi-unwind进展Never类型稳定的进展异步Rust的进展原文链接,http://smallcultfollowing.com/babysteps/blog/2020/12/18/looking-back-on-2020/Hotpatch此crate主要用于以极其简单的方式,从共享对象文件中加载新的函数定义。主要功能包括:线程

  • 权限数据库

    权限数据库~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~开发工具与关键技术:MVC作者:盘洪源撰写时间:2019年7月27日星期六一般的项目都是需要做到权限这一块的,权限就是不同的角色可以使用不同的功能和页面,这个肯定要分清楚,不然这个登录的角色就没什么意义了。比如说,一个店里面会分:老板、店长、员工这样分,这样的一个角色就需要起到它的效果。看下图:我做的这个是一个比较简单的权限,主要就是上面这七张表:用户表、用户角色明细表、用户角色表、权限表、模块明细表、模块表、操作表,用户表和这个用户角色表就不用多说了,这个用户角色明细表主要是因为用户对角色是一个多对多的关系,所以就需要这个中间表。然后就是这个权限表,这个表也是一个中间表,这里面也是一个多对多的一个关系,不同的角色可以操作不同的模块也可以操作一样的模块。然后就是一个模块明细表,这个表也是一个多对多多的关系,因为不同的模块的有些功能可能一样。下面是模块表和操作表的一个数据:这里面的模块表对应的是项目的导航处的一些大模块,这里

  • markdown 转 pdf 以及 mardown 转 html

    项目地址:https://github.com/klren0312/markdownConvert 1.markdown转pdf1.使用第三方库markdown-pdfrimraf2.代码解读1.引入库constmtp=require('markdown-pdf') constfs=require('fs') constpath=require('path') constrm=require('rimraf')复制2.初始化文件目录 需要将存在的pdf目录清除重建constmdFolder='markdown'//md目录 constpdfFolder='pdf'//pdf目录 rm.sync(path.resolve(pdfFolder))//删除pdf文件夹 if(!fs.existsSync(pdfFolder)){ fs.mkdirSync(pdfFolder);//新建pdf文件夹 }复制3.生成pdf文件 循环读取mardown文件夹中文件,读取mark

  • Python3学习笔记 | 六、Python的类型与运算-列表

    一、列表简介列表在Python里是有序集合对象类型,列表里的对象可以是任何对象:数字,字符串,列表或者之后会讲到的字典、元组等等。 与字符串不同,列表是可变对象,支持原处修改的操作。Python中的列表可以完成大多数集合体数据结构的工作,而这些在稍底层一些的语言中你不得不手工去实现。Python的列表是: •任意对象的有序集合 •通过偏移读取 •可变长度、异构以及任意嵌套 •属于可变序列的分类 •对象引用数组二、列表的操作1、与字符串相同的操作之前在字符串里的大部分操作都可以用在列表,比如合并与重复: List1+List2:结果是两个列表按顺序结合。 List1*3:结果是列表1重复三次。 foriinList1:printi:按顺序打印列表里的内容 3inList:判断列表里有没有一个对象是对象3 List1.index(1):查找列表里第一个为1的对象的位置 List1.count(1):查找列表里对象为1的个数 List1[x:y]:取第x到y的对象,重新建立一个列表 len(List1):List1里的对象个数2、基本列表操作创建一个列表:>>>list1=

  • MySQL常用工具、日志及读写分离

    MySQL常用工具、日志及读写分离1.MySQL中常用工具1.1mysql1.1.1连接选项1.1.2执行选项1.2mysqladmin1.3mysqlbinlog1.4mysqldump1.4.1连接选项1.4.2输出内容选项1.5mysqlimport/source1.6mysqlshow2.MySQL日志2.1错误日志2.2二进制日志2.2.1概述2.2.2日志格式2.2.3日志读取2.2.4日志删除2.3查询日志2.4慢查询日志2.4.1文件位置和格式2.4.2日志的读取3.MySQL复制3.1复制概述3.2复制原理3.3复制优势3.4搭建步骤3.4.1master3.4.2slave4.通过AOP记录操作日志4.1自定义注解4.2性能优化-分页4.8.1优化count1.MySQL中常用工具1.1mysql该mysql不是值mysql服务,而是指mysql的客户端工具。 语法: mysql[options][database]1.1.1连接选项1.1.2执行选项-e,--execute=name:执行sql语句并退出 1.2mysqladminmysqladmin是一个执行管

  • 优秀攻城师必知的正则表达式语法

    前言最近公司的一个项目,大量用到了正则来处理文本,以前对正则使用仅限于小打小闹,用的也是一知半解,经过本次的深入使用,发现正则表达式真的是每一位开发者都需要具备的一个基础技能,处理文本的功能异常强大。今天我们就来系统的学习一下它。关于正则表达式正则表达式是一种模式匹配引擎,也称为NondeterministicFiniteAutomaton(NFA)非确定性有限自动机,为什么叫非确定性呢?因为对于文本搜索可能有多种情况,而正则表达式会尽量穷举所有的可能来找到我们匹配的数据,这种方式也称为回溯,是正则表达式原理里面一个重要的思想。正则表达式是用来处理文本字符串的神器没有之一,如果没有正则表达式,处理一些数据校验和提取,替换工作会变得非常麻烦,例如:验证邮箱是否合法,提取网址,校验日期,校验电话号码,模糊搜索等等。使用正则表达式来匹配文本,主要有两种直观的反馈结果:(1)回答我true/false,用来表达是否满足匹配条件(2)除了回答我true/false外,还要告诉我每一响匹配数据是什么,以及在文本中的起始位置。在Java里面,关于正则有两个核心类,分别是:(1)java.util.r

  • CSS粘性定位是怎样工作的 [每日前端夜话0x1F]

    每日前端夜话0x20每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:1573字预计阅读时间:7分钟翻译:疯狂的技术宅 原文:https://medium.com/@elad/css-position-sticky-how-it-really-works-54cd01dc2d46浏览器对CSS粘性定位有着非常好的支持,但很多开发者都没有用过它。究其原因有两个:第一,受到浏览器的良好支持需要漫长的等待:浏览器的支持往往需要很长的时间才能完成,到时候它的功能已经被人们遗忘了。第二个原因是很多开发者并不能完全理解其工作原理背后的逻辑,这就是我的切入点。我假设你们都知道什么事CSS定位,不过还是先简单回顾一下比较好:在3年前,有四种CSS定位:static、relative、absolute和fixed。static、relative、absolute和fixed之间主要的区别在于它们在DOM流中占用的空间。static和relative会保留它们在文档流中的自然空间,而absolute和fixed则不会——它们的空间被移除而且具有浮动行为。正如我下面将要解释的那样,新的粘性定位与

  • nodejs与nginx的完美搭配

    引言node自己本身可以作为服务器进行驱动,但是node本身对文件的处理能力并不是很好,所以当我们的生产环境中应尽量使用nginx来处理静态的资源以及反向代理,同时也解决了node分布式以及负载均衡的相关问题。nginx的安装以及配置这里以centos环境为基础进行配置1、基础编译环境的配置C/C++等编译工具以及工具库:yum-yinstallmakezlibzlib-develgcc-c++libtoolopensslopenssl-devel复制2、PRCE安装(1)下载:wgethttp://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz复制(2)解压tar-zxvfpcre-8.35.tar.gz复制(3)安装cdpcre-8.35 ./configure make&&makeinstall复制3、安装Nginx(1)下载wgethttp://nginx.org/download/nginx-1.10.3.tar.gz复制(2)解压、安装tar-zxvfnginx-1.10.3

  • Crontab自动记录服务器负载

    每分钟自动记载uptime,并记录到log文件。crontab-e复制然后,在crontab中添加以下自动命令:*****uptime>>/home/wwwlogs/load.log复制 以上规则为每分钟自动记录。如果不行,可以手动执行一下。再给755权限chmod755/home/wwwlogs/load.log复制效果如下图:

  • EOSIO 4.0测试网络启动教程

    EOS4.0在昨天已经发布,本片文章将介绍EOS4.0网络的搭建过程。与EOS3.0相比,EOS4.0无疑是具有重要意义的预发布版。其中对eosio.system合约的更改相当大。下面就来说一下搭建网络的具体步骤。节点简介首先说明一下,搭建测试网络的节点信息,以免后文更加清晰的讲述整个过程。node1(启动节点ip=111.11.11.111):producer-name=eosio http-server-address=0.0.0.0:8888 p2p-listen-endpoint=0.0.0.0:9876 p2p-peer-address=222.22.22.222:9876 p2p-peer-address=333.33.33.333:9876 enable-stale-production=true复制node2(启动节点:ip=222.22.22.222):producer-name=eostea http-server-address=0.0.0.0:8888 p2p-listen-endpoint=0.0.0.0:9876 p2p-peer-addre

  • telnet 命令使用方法详解,telnet命令怎么用?[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。 什么是Telnet?   对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具。一旦入侵者与远程主机建立了Telnet连接,入侵者便可以使用目标主机上的软、硬件资源,而入侵者的本地机只相当于一个只有键盘和显示器的终端而已。  为什么需要telnet?   telnet就是查看某个端口是否可访问。我们在搞开发的时候,经常要用的端口就是8080。那么你可以启动服务器,用telnet去查看这个端口是否可用。  Telnet协议是TCP/IP协议家族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。  Win

  • React源码分析7-state计算流程和优先级

    setState执行之后会发生什么setState执行之后,会执行一个叫enqueueSetState的方法,这个主要作用是创建Update对象和发起调度,可以看下这个函数的逻辑enqueueSetState:function(inst,payload,callback){ //1.inst是组件实例,从组件实例中拿到当前组件的Fiber节点 varfiber=get(inst); vareventTime=requestEventTime(); varlane=requestUpdateLane(fiber); //2.1根据更新发起时间、优先级、更新的payload创建一个update对象 varupdate=createUpdate(eventTime,lane); update.payload=payload; //2.2如果setState有回调,顺便把回调赋值给update对象的callback属性 if(callback!==undefined&&callback!==null){ update.callback=callback; } //3.将up

  • 腾讯云主机安全获取索引列表api接口

    1.接口描述接口请求域名:cwp.tencentcloudapi.com。 获取索引列表 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeIndexList。 Version 是 String 公共参数,本接口取值:2018-02-28。 Region 是 String 公共参数,详见产品支持的地域列表。 3.输出参数 参数名称 类型 描述 Data String ES索引信息 RequestId String 唯一请求ID,每次请求都会返回。定位问题时需要提供该次请求的RequestId。 4.示例示例1获取索引列表输入示例https://cwp.tencentcloudapi.com/?Act

  • 二分查找

    二分查找简单例子 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。 示例1: 输入:[3,4,5,1,2] 输出:1 复制 示例2: 输入:[2,2,2,0,1] 输出:0 复制 varminArray=function(numbers){ letlow=0; lethigh=numbers.length-1; while(low<high){ letpivot=low+Math.floor((high-low)/2); if(numbers[pivot]<numbers[high]){ high=pivot; }elseif(numbers[pivot]>numbers[high]){ low=pivot+1; }else{ high-=1; } } returnnumbers[high]; }; 复制 来源:力扣(LeetCode) 链接:https://leetcode-cn.com

  • 【loj#2133 &amp;&amp; luoguP2178】[NOI2015]品酒大会

      题目传送门:loj#2133luoguP2178   简要题意:给定一个字符串\(s\),每个后缀都有权值,对于每个长度\(len\),求出所有最长公共前缀\(\geqlen\)的后缀对的总数和每个这样的后缀对,两后缀权值乘积的最大值。   我们可以先把后缀数组求出来,把最长公共前缀长度转化为height数组的区间\(\min\),考虑固定\(len\),容易发现合法的后缀对的取值范围被height数组上小于\(len\)的位置划分成了若干区间,同时当\(len\)变小的时候,相邻区间会发生合并。   于是倒序枚举\(len\),用并查集辅助合并合法区间,同时统计贡献就可以解决问题了。 mycode ```cpp #include #include #include #include #include #definelllonglong #defineinf0x3f3f3f3f #definemaxn300010 inlinellread() { llx=0;charc=getchar(),f=1; for(;c<'0'||'9'

  • STM32之IO口模拟SPI

    本文介绍如何使用STM32标准外设库的GPIO端口模拟SPI,本例程使用PA5、PA6和PA7模拟一路SPI。SPI有4种工作模式,模拟SPI使用模式0,即空闲时SCK为低电平,在奇数边沿采样。 本文适合对单片机及C语言有一定基础的开发人员阅读,MCU使用STM32F103VE系列。   1.  简介 SPI协议是由摩托罗拉公司提出的通讯协议(SerialPeripheralInterface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在要求通讯速率较高的场合。SPI用于多设备之间通讯,分为主机Master和从机Slave,主机只有一个,从机可以有多个,通过片选信号对从机进行选择,一次只能选择一个从机。通讯只能由主机发起,支持的操作分为读取和写入,即主机读取从机的数据,以及向从机写入数据。 SPI一般有4根线,分别是片选线SS、时钟线SCK、主设备输出\从设备输入MOSI、主设备输入\从设备输出MISO,其中除MISO对于主机为输入引脚外,其他引脚对于主机均为输出引脚。因为有独立的输入和输出引脚,因此SPI支持全双工工作模式,即可以同

  • P2858 [USACO06FEB]奶牛零食Treats for the Cows

    区间dp,,,我不会啊,,dp好久没做了。 区间dp是用来处理相邻合并继承的问题的,例如本题,相邻是条件。f[i][j]中i,j一般是区间左右端点。可以表示还剩这个区间时最大价值(例如本题),所以最后列举的是长度为一的区间。但大多数是表示此区间已处理时的最大值。一般一维循环枚举len长度,一维枚举左端点,手算右端点。也可以枚举左右端点。 #include<iostream> #include<cstdio> usingnamespacestd; intf[2011][2011],a[2011],n,maxn; intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++)scanf("%d",&a[i]); for(inti=1;i<=n;i++){ for(intj=n;j>=i;j--){ f[i][j]=max(f[i-1][j]+(n-j+i-1)*a[i-1],f[i][j]); f[i][j]=max(f[i][j+1]+(n-j+i-1)*a[j+1],f[i][j]); }

  • 【cmd关闭指定端口】Windows下关闭指定端口对应的进程

    第一步:查看指定端口对应的进程号 netstat-ano|findstr"8081"复制 回车执行该命令,最后一位数字就是PID,这里是9088。  第二步:查看进程对应的程序 查看ID为9088的进程对应那个程序,结果是node.exe tasklist|findstr"9088"复制    第三步:结束对应的进程,解除端口号被占用 强制(/F参数)杀死pid为9088的所有进程包括子进程(/T参数): taskkill/T/F/PID9088复制 参考博文:Windows下如何查看某个端口被谁占用复制

相关推荐

推荐阅读