1. 程式人生 > 其它 >演算法:計算陣列指定索引內的累計之和

演算法:計算陣列指定索引內的累計之和

演算法:計算陣列指定索引內的累計之和
        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);
            }
        }