尺取法知识点讲解

2024-04-20 16:12
文章标签 讲解 知识点 取法

本文主要是介绍尺取法知识点讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、固定长度的情况:

最小和(sum)  

输入N个数的数列,所有相邻的M个数的和共有N-M+1个,求其中的最小值。

输入格式

第1行,2个整数N,M,范围在[3…100000],N>M。

第2行,有N个正整数,范围在[1…1000]。 

输出格式

1个数,表示最小和。 

输入/输出例子1

输入:

6 3

10 4 1 5 5 2

输出:

10

【方法一】:枚举开始点,计算连续M个数的和,求出最小值。

程序如下:

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100005],mins=0x7f7f7f7f7f7f7f7f;
int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n-m+1;i++){long long s=a[i];for(int j=i+1;j<=i+m-1;j++)s+=a[j];mins=min(s,mins);}cout<<mins;return 0;
}

时间复杂度是o(n*m)如果数据量太大会超时。

微信截图_20231028101330.png

如图1所示,如果以第一个数开始计算也就是图1红色部分。

s1=a[1]+a[2]+a[3]   

如图2所示,如果以第二个数开始计算也就是图2蓝色部分

         s2=a[2]+a[3]+a[4]

对比图1和图2,公式s1和s2,我们会发现,如果以第一个数开始枚举m=3个数的和,和以第二个数开始枚举m个数的和,重复了a[2]+a[3],也就是说,我们第一个数开始枚举完m个数的和后,完全不用从第二个数再重新枚举,只要在s1的基础上保留重复部分a[2]+a[3],去掉左边的a[1],加入右边的a[4],让长度保持m个。

s1=a[1]+a[2]+a[3]  

s2=s1-a[1]+a[4]

尺取法:就如尺子一样,利用两个指针L和R,L代表左边枚举开始点,,R代表枚举结束点,s代表区间L到R的和,如果此时L到R刚好m个数,也就是R-L+1==m,那么找到一个长度为m的和,后面只要把s=s-a[L]+a[R+1],L++,R++,让其长度保持为m。

【程序如下】:

#include<bits/stdc++.h>
using namespace std;
long long n,m,s,a[100005],mins=0x7f7f7f7f7f7f7f7f;
int main(){cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int L=1,R=1;R<=n;R++){s+=a[R];if(R-L+1==m){mins=min(mins,s);s=s-a[L];L++;}}cout<<mins;return 0;
}

二、不固定长度情况

无标题.png

【程序如下】:

#include<bits/stdc++.h>
using namespace std;
long long n,m,s,a[100005];
int main(){cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];int minL=n+1;for(int L=1,R=1;R<=n;R++){s+=a[R];while(s>=m){minL=min(minL,R-L+1);s=s-a[L];L++;}}cout<<minL;return 0;
}

三、总结

尺取法是一种线性算法,也是一种高效的枚举区间的方法。

记 (l,r)两个端点为一个序列内以l为起点的最短合法区间,如果r随l的增大而增大的话,我们就可以使用尺取法。

具体的做法是:

    1.初始化左右端点

    2.不断扩大右端点,直到满足条件

    3.如果第二步中无法满足条件,则终止,否则更新结果

    4.将左端点扩大1,然后回到第二步

因为r随 l增大而增大,所以 r只有 n次变化的机会,所以时间复杂度为O(n)。

这篇关于尺取法知识点讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920716

相关文章

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou