【算法】尺取法——快速求解取连续子序列问题

原创 2018年04月15日 21:53:02

算法描述

这个算法通过反复推进开头和结尾,可以在O(n)的线性时间内解决连续子序列问题。

算法模拟

比如当前pre=i,pro=j,temp=a[i]+a[j]。
1.如果temp-a[i] > M,则推进pre,pre++,temp-=a[i]
重复1直到temp-a[i] < M
2.如果temp-a[i] < M,则 i—j 为以j为终点最靠近M的值
挑战程序设计大赛图

void solve(){
    int temp=0,pre=0;
    for(int i=0;i<N;i++){
        temp+=d[i];
        while(temp>=M){
            print(pre,i);//这里用于观察前后变化
            if(temp-d[pre]<M){
                break;
            }
            else{
                temp-=d[pre];
                pre++;
            }
        }
    }
} 

测试代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#define INF 99999999
using namespace std;
int d[]={5,1,3,5,9,7,4,9,2,8},N=10,M=15;

void print(int a,int b){
    for(int i=0;i<N;i++)
    if(i>=a&&i<=b)printf("%d ",d[i]);
    else printf("  ");
    printf("\n");
}
void solve(){
    int temp=0,pre=0;
    for(int i=0;i<N;i++){
        temp+=d[i];
        while(temp>=M){
            print(pre,i);
            if(temp-d[pre]<M){
                break;
            }
            else{
                temp-=d[pre];
                pre++;
            }
        }
    }
} 
int main(){
    solve();
    return 0;
}


算法学习之尺取法

连续区间覆盖问题
  • cumtcyf
  • cumtcyf
  • 2016-07-31 16:56:25
  • 1377

【高效算法设计——滑动窗口】UVa 11572 Unique Snowflakes

题意:给定n个数,求最长的一段使得该段内没有重复数字 思路:对于该类段查找问题可以采用经典的滑动窗口方法,即维护一个窗口,窗口的左右边界用两个变量L,R代表,先增加R直到出现重复数字,再增加L,再...
  • lth404391139
  • lth404391139
  • 2015-03-11 22:39:22
  • 467

java 之连续子序列最大和问题的四个解法

import java.util.Random; public final class MaxSumTest {     static private int seqStart = 0;   ...
  • zhang434
  • zhang434
  • 2014-02-17 17:19:59
  • 1593

算法--尺取法

尺取法通常是指对数组保存一对下标(起点,终点),然后根据实际情况交替推进两个端点直到得出答案的方法,这种操作很像是尺取虫爬行的方式故得名。...
  • qq_29600137
  • qq_29600137
  • 2016-03-10 11:00:25
  • 428

笔试算法学习--最大连续子序列和

例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20。 1)动态规划,dp[i]中保存前i-1个数的最大和; #incl...
  • hyqwmxsh
  • hyqwmxsh
  • 2016-09-24 20:38:47
  • 132

快速幂取余算法

下面是一个快速幂的介绍: 先贴一个秦九韶算法(Horner算法)的原理: 设有项的次函数 将前项提取公因子,得 再将括号内的前项提取公因子,得 ...
  • xiaotan1314
  • xiaotan1314
  • 2015-07-27 20:59:05
  • 3611

快速中值求取算法

中值排序,这个大家都会比较清楚。 int CQuickMedian(int * pnData, const int knLength) { int nLow = 0; int ...
  • zhoudewen66
  • zhoudewen66
  • 2017-05-29 18:42:57
  • 1076

C 最大子序列算法

  • 2015年03月14日 17:46
  • 2KB
  • 下载

逐位相加法-快速取模算法

任意两个整数 A B 做乘法 C = A×B 然后把 A,B, C的十进制每个数分别相加,如果和大于10就继续把每个数相加,直到只剩一位数,分别得到 A1 B1 C1 D = A1 × B...
  • makenothing
  • makenothing
  • 2016-02-28 15:55:35
  • 1974

求中位数,快速选择算法

实验五    输油管道问题的设计与实现 [实验目的] 1、掌握分治算法的基本原理 2、利用分治策略编程解决输油管道问题 [实验内容] 问题描述 某石油公司计划建造一条由东向西的主输油管道。...
  • update7
  • update7
  • 2017-07-11 15:12:56
  • 35373
收藏助手
不良信息举报
您举报文章:【算法】尺取法——快速求解取连续子序列问题
举报原因:
原因补充:

(最多只允许输入30个字)