算法:计算数组指定索引内的累计之和
package com.ArraysDemo;
//设计一个类
public class Demo01 {
public static class RangeSum2{
//设计一个数组
private int[] preSum;
//设计一个带数组参数的构造器;
//设计目的:
//获取数组长度N
//开辟一个相应的数组空间preSum
//使首元素相等
//然后执行一个操作:令i=1;和0位置的数相加将值给preSum,实现依次循环累加赋值
public RangeSum2(int array[]){
//数组长度为N
int N = array.length;
//给数组preSum开辟了一个长度为N的空间
preSum =new int[N];
//preSum为数组的首位
preSum[0] =array[0];
//这里实际proNum从0开始计算;则长度是从1开始计数;所以i<n;不能等于长度本身
for(int i=1;i<N;i++){
//算法核心:将i索引的前一个值和当前值相加,赋值给i索引的当前值
preSum[i]= preSum[i-1]+array[i];
}
}
/*
这里已经算出了全部的累加数;记录到preSum[i]
通过传入的下标索引,将对应的值给到下面的preSum[R];
即这里交出的是到索引处的依次累加和
*/
//设计一个方法,传入两个数;执行;a-b数组相加
//原理:如果是0;则返回b的数组值
//否则,返回a的数组值-b的索引-1的数组值
public int RangeSum2(int L,int R){
/*
preSum[R]到R的累加和;减去之前的累加和;即为指定累加和
*/
return L ==0?preSum[R]:preSum[R]-preSum[L-1];
}
}
//方法二:适用与频繁的计算操作
public static class RangSum1{
private int[] arr;
public RangSum1(int []array){
arr= array;
}
public int rangeSum(int L,int R){
int sum = 0;
//依次对前面的数进行相加操作
for (int i =L;i<=R;i++){
sum +=arr[i];
}
return sum;
}
}
public static void main(String[] args) {
int []arr={1,3,5,6,7,8,54,34,23};
RangeSum2 rangeSum2 = new RangeSum2(arr);
int sum2 = rangeSum2.RangeSum2(2, 2);
RangSum1 rangSum1 = new RangSum1(arr);
int sum = rangSum1.rangeSum(2, 2);
System.out.println(sum);
System.out.println(sum2);
}
}