求数组的区间和

问题描述 就是输入n 然后输入n个数 下标为1~n 然后查询 查询次数不知道 但是以0 0 作为结束的标志 查询为l r 就是输出[l,r]区间的和

//这事朴素的求数组区间和的问题 
import java.util.Scanner;
public class Main{
	public static void main(String args[]){
		Scanner input=new Scanner(System.in);//作为输入数据的标示
		final int maxl=10000;//这里定义是为了数组的动态输入
		int[] a=new int[maxl];
		int[][] b=new int[maxl][maxl];
		int n=input.nextInt();//这是输入一个整数的函数  另外可以自学一下这个输入流的函数都有哪些
		for(int i=1;i<=n;i++) a[i]=input.nextInt();//输入n个数
		int sum;//这里借助额外的变量来辅助   复杂度为n*n  当n太大的时候需要我们去用数据结构来把复杂度降低为nlog(n) 这个我们后期再说
		for(int i=1;i<=n;i++){
			sum=0;
			for(int j=i;j<=n;j++){
				sum+=a[j];
				b[i][j]=sum;
			}
		}
		
		int l,r;
		while(true){
			l=input.nextInt();
			r=input.nextInt();
			if(l==0&&r==0) break; //在没有做其它的操作之前就要先判断  因为要是0 0的话就直接退出了
			System.out.println(b[l][r]);
		}
		input.close();//关闭输入流
	}
}

//这是求一个数组的最大子数组最大和的问题 就是连续和最大  不要以为所以得数加起来最大  万一有负数呢
import java.util.Scanner;
public class fibonacci {
	public static void main(String args[]){
		Scanner input=new Scanner(System.in);//作为输入数据的标示
		final int maxl=10000;//这里定义是为了数组的动态输入
		int[] a=new int[maxl];
		int[][] b=new int[maxl][maxl];
		int n=input.nextInt();//这是输入一个整数的函数  另外可以自学一下这个输入流的函数都有哪些
		for(int i=1;i<=n;i++) a[i]=input.nextInt();//输入n个数
		int l=1,r=1,k=1;//这里假定的初始下标都是从1开始的  然后k只是一个辅助变量
		int max=-9999,temp=0;//初始的时候一个都没有加 temp为0 这里把max赋值一个很小的数是因为保证数组中的数没有比它还小的
		for(int i=1;i<=n;i++){
			temp+=a[i];
			if(temp>max){   //这里表示加了之后它的值变大了  所以这个就直接加入
				r=i;//r是一直跟着上面的i往前走的
				l=k;//这里的话就是等于经过k处理过的左边界
				max=temp;//同时更新最大值
			}
			else if(temp<0){//发现连续和有负数的 那么还不如不加
				temp=0;  //所以就直接不加
				k=i+1; //这里的下标要边  把前面记录的下标都抛弃
			}
		}
		System.out.println("最大值为   "+max+"  左下标   "+l+"   右下标   "+r);
		input.close();//关闭输入流
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值