如何用取尺法处理连续区间内数字相同

经常会遇到类似下面这种问题:

给你n个数,由0和1组成,问1或者0的最大连续长度是多少

110001101的最大连续长度就是中间3个连续的0,所以是3

这里稍微总结出了一个取尺法,以后遇到这样的题目就不需要再思考太多细节了

int L, R = 1, ans = 0;
for(L = 1; L <= n; L = R + 1) {
    for(R = L; R + 1 <= n && B[L] == B[R + 1]; R++);
    ans = max(ans, R - L + 1);
}

其中n是数组的长度,下标从1开始,B表示对应的数组

这样得到的ans就是最大连续长度了

如果是需要对1的连续区间进行处理的话,也只需要把更新ans那句话加上判断,判断这个区间的某一个是否为1,然后再进行处理就行了

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 23:14:43

如何用取尺法处理连续区间内数字相同的相关文章

怎样用取尺法处理连续区间内数字同样

常常会遇到类似以下这样的问题: 给你n个数.由0和1组成,问1或者0的最大连续长度是多少 110001101的最大连续长度就是中间3个连续的0.所以是3 这里略微总结出了一个取尺法,以后遇到这种题目就不须要再思考太多细节了 int L, R = 1, ans = 0; for(L = 1; L <= n; L = R + 1) { for(R = L; R + 1 <= n && B[L] == B[R + 1]; R++); ans = max(ans, R - L + 1)

取尺法(算法)

1 /*常用的解题技巧:尺取法 2 尺取法:顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案.之所以需要掌握这个技巧,是因为尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的 3 时候,所以尺取法是一种高效的枚举区间的方法,一般用于求取有一定限制的区间个数或最短的区间等等.当然任何技巧都存在其不足的地方,有些情况下尺取法不可行,无法得出正确答案. 4 使用尺取法时应清楚以下四点: 5 1

计蒜客第五场 UCloud 的安全秘钥(中等) (尺取游标法

每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 中出现的次数等于 cc 在 bb 中出现的次

poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accepted: 8033 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Y

快速排序之三数取中法

---恢复内容开始--- 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 基本步骤 三数取中 在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分.在此我们采用三数取中法,也就是取左端.中间.右端三个数,然后进行排序,将中间数作为枢纽值. 根据枢纽

【实操】进制转换:除基倒取余法

一.原理:除基倒取余法 以10进制转2进制为例:输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒着依次排列,就构成了转换后的二进制数. 所有进制之间的转换都是如此,2可以换成任何数字.十进制转二进制.八进制.十六进制.64进制,全部如下. 二.具体的JAVA实现: 2.1 10进制数字转n进制: public class Main { public static void main (String[] args) { int n = 64;

将时间转换成数字,把数字转换成时间,均匀取一定时间间隔(比如每91秒取一条记录)内的符合条件的记录

/****** Script for SelectTopNRows command from SSMS  ******/SELECT  [id]      ,[tagDate],CAST(tagdate as float)*10000000000 as numdate      ,[HZ105_315HH]      ,[HZ105_DO315AI]      ,[HZ105_FI315AI]      ,[HZ105_PH315AI]      ,[HZ105_PI315AI]      ,[

回溯法第1题—数字排列问题

[问题描述] 列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入:n(1<=n<=9) 输出:由1~n组成的所有不重复的数字序列,每行一个序列. [样例输入] 3 [样例输出] 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 [问题分析] 这题要求输出n个数的全排列(从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列). 显然也没有什

在0~N个数字中,取指定个数的不重复数字,要求这些数字的和为指定值,求所有结果

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApp1 { 7 class Program { 8 static void Main(string[] args) { 9 10 // 防止出现随机值无法组合 11 while (ResDic.Count == 0) { 12 13 Con = 10; 14 // 初