小算法~(一个数组查找 数组索引范围 值的总和 )

package find;

/** 返回 数组范围和
 * 第一种方法明显在空间上节省不少,但是却多了一步 减的操作
 * 第二种方法在空间上多了很多,但是如果在取出数组范围和达到一定量级
 * 量变引起质变,第二种就会比第一种好
 * @author codelmh
 * @data 2021/12/5
 */
public class FindRangeSum {
    public static void main(String[] args) {
        int[] arr = {1, 5, 9, 4, 6, 10, 2};
        System.out.println(sumRange1(arr, 0, 2));
    }

    /**
     *  用一个一维数组(h[arr.length])存储数组的 0~当前下标的和
     *  如果要返回范围则 只需要 h[right] - h[left] 就能得到
     * @param arr
     * @param left
     * @param right
     * @return
     */
    public static int sumRange1(int[] arr, int left, int right){
        int[] h = new int[arr.length];
        h[0] = arr[0];
        for (int i = 1; i < arr.length; i++){
            h[i] = h[i - 1] + arr[i];
        }
        for (int j = 0; j < arr.length; j++){
            System.out.print(h[j]+" ");
        }
        if (left == 0 && right == arr.length-1) {
            return h[arr.length-1];
        }
        return  h[right]-h[left];
    }

    /**
     * 用一个二维数组(newArr[][])来存储每一个范围查询的值 如果需要取left ~ right范围的和
     * 则直接从二维数组 取 newArr[left][right]的值即可
     * @param arr
     * @param left
     * @param right
     * @return
     */
    public static int sumRange2(int[] arr, int left, int right) {
        //定义一个存储每一个范围和的二维数组
        int[][] newArr = new int[arr.length][arr.length];
        for(int i = 0; i < arr.length; i++){
            for (int j = i; j < arr.length; j++){
                if ( i == j){
                    newArr[i][j] = arr[i];
                }else {
                    newArr[i][j] = newArr[i][j-1] + arr[j];
                }
            }
        }
        return newArr[left][right];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值