Java实现尺取法
同学推荐的一题,看了别人及讲解,学到了一点新的东西------尺取法 例题如下: Description
A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the sequence, the sum of which is greater than or equal to S. Input
The first line is the number of test cases. For each test case the program has to read the numbers N and S, separated by an interval, from the first line. The numbers of the sequence are given in the second line of the test case, separated by intervals. The input will finish with the end of file. Output
For each the case the program has to print the result on separate line of the output file.if no answer, print 0. Sample Input 2 10 15 5 1 3 5 10 7 4 9 2 8 5 11 1 2 3 4 5 Sample Output 2 3 自己是真的菜,所有题目拿到的第一反应都是暴力求解,看完别人的才想到有尺取法这么有效的东西。 尺取法 就是像尺一样可以伸长与缩小。 步骤1主要是先初始化左右端点,怎么初始化呢?先是找到符合条件的端点,即从第一个端点开始往后延伸,直到出现符合条件的端点 步骤2就是开始缩减区间的长度,这里重要的判断标准就是,如果条件成立,那就将左端点向右延伸,左端点不动,但是一旦出现条件不成立的情况,就应该将右端点向左延伸,直到条件满足位置,重复此循环直到整个数组都经历过判断后即可,时间复杂度从O(n*n)降到了O(n),非常方便。
import java.util.Scanner;
public class num3061第二版 {
public static void figure(int []num,int n)
{
int sum=0;
for(int i=0;i<num.length;i++)
sum+=num[i];
if(sum<n)
System.out.println(0);
else
{
int s1=0,s2=0,res=num.length,sum1=0;
for(;;)
{
while(s1<num.length&&sum1<n)//这里进行初始化左右端点
sum1+=num[s1++];
if(sum1<n)
break;
res=Math.min(res, s1-s2);//每次结算最小的区间长度
sum1-=num[s2++];
}
System.out.println(res);
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<n;i++)
{
int m1=sc.nextInt();
int m2=sc.nextInt();
int []num=new int [m1];
for(int j=0;j<m1;j++)
num[j]=sc.nextInt();
figure(num, m2);
}
}
}
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Head First设计模式——桥接模式
- Head First设计模式——生成器模式和责任链模式
- Head First设计模式——蝇量模式和解释器模式
- 【每日一题】33. Search in Rotated Sorted Array
- 【每日一题】34. Find First and Last Position of Element in Sorted Array
- 【每日一题】35. Search Insert Position
- Head First设计模式——原型模式和访问者模式
- Java 新特性前瞻:封印类
- 每天手撕一道算法题-130. 被围绕的区域
- C#实现前向最大匹、字典树(分词、检索)
- Tomcat 中文乱码,设置UTF-8
- 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper
- IDEA将Maven项目中指定文件夹下的xml等文件编译进classes
- 数据误操作,教你使用ApexSQLLog工具从 SQLServer日志恢复数据!
- 从零搭建Spring Boot脚手架(5):整合 Mybatis Plus