首页 > 其他分享 >LeetCode | 303 RangeSumQueryImmutable

LeetCode | 303 RangeSumQueryImmutable

时间:2024-08-02 20:28:11浏览次数:14  
标签:nums int 303 System RangeSumQueryImmutable preSum left LeetCode out

https://github.com/dolphinmind/datastructure/tree/datastructure-array-02

分析

  • 所求解的区间[left,right]具有连续性,执行常规for循环计算,[0,left-1]的区间元素累加和 与[0, right]的区间元素累加和,有重复的运算区间[0,left)。累加和与长跑比赛其实一致,求取[left,right]区间的累计和,看做求取两者之间的距离差

  • 倘若使用for循环频繁调用累加和计算,可以加一层缓存,用空间换取运算时间,即记录任意情况下left和right累积跑过的路程,两者相减即可

  • 前缀和数组preSum[0]=0可以接收输入的nums 数组为空

  • 同时思考前缀和数组的还原

主类

package com.github.dolphinmind.array;

/**
 * @author dolphinmind
 * @ClassName RangeSumQueryImmutable
 * @description 303. 区域和检索 - 数组不可变
 * @date 2024/8/2
 */

public class RangeSumQueryImmutable {

    // 前缀和数组 缓存概念
    private int[] preSum;
    private int[] recoverArray;
    private int length;

    public RangeSumQueryImmutable(int[] nums) {
        length = nums.length;

        // 初始化前缀和数组 preSum[0]=0
        preSum = new int[length + 1];

        // 初始化恢复数组 recoverArray
        recoverArray = new int[length];

        for (int i = 1; i < preSum.length; i++) {
            preSum[i] = preSum[i-1] + nums[i-1];
        }

    }

    public int sumRange(int left, int right) {

        if (left < 0 || right >= preSum.length - 1) {
            System.out.print("索引超出数组范围: ");
            return -1;
        }

        if (left == right) {
            System.out.print("索引相同: ");
            return 0;
        }

        if (left > right) {
            System.out.print("索引顺序错误: ");
            return preSum[left+1] - preSum[right];
        }

        System.out.print("索引顺序正确: ");
        return preSum[right + 1] - preSum[left];

    }

    public void recoverArray() {
        for (int i = length-1 ; i >= 0; i--) {
            recoverArray[i] = preSum[i+1]-preSum[i];
        }
    }

    public void printArray(int[] nums) {
        System.out.println();

        System.out.print("[");
        for (int item : nums) {
            System.out.print(item + " ");
        }
        System.out.print("]");
    }

    public void printOriginArray(int[] nums) {
        System.out.print("\n原始数组:");
        printArray(nums);
    }
    public void printPreSum() {
        System.out.print("\n前缀和数组:");
        printArray(preSum);
    }

    public void printRecoverArray() {
        this.recoverArray();
        System.out.print("\n复原数组: ");
        printArray(recoverArray);
    }
}


测试类

package com.github.dolphinmind.array;

import org.junit.Test;

/**
 * @author dolphinmind
 * @ClassName RangeSumQueryImmutableTest
 * @description
 * @date 2024/8/2
 */

public class RangeSumQueryImmutableTest {

    @Test
    public void test_sunRange() {
//        int[] nums = {-2, 0, 3, -5, 2, -1};
//        int[] nums   =  {   1, 2, 3, 4,  5,  6,  7,  8};
        int[] nums   = {};

        RangeSumQueryImmutable rangeSumQueryImmutable = new RangeSumQueryImmutable(nums);

        rangeSumQueryImmutable.printOriginArray(nums);
        rangeSumQueryImmutable.printPreSum();
        rangeSumQueryImmutable.printRecoverArray();

        System.out.println("\n");
        System.out.println(rangeSumQueryImmutable.sumRange(2, 2));
        System.out.println(rangeSumQueryImmutable.sumRange(0, 1));
        System.out.println(rangeSumQueryImmutable.sumRange(1, 0));
        System.out.println(rangeSumQueryImmutable.sumRange(1, 9));
        System.out.println(rangeSumQueryImmutable.sumRange(0, 7));

    }
}

标签:nums,int,303,System,RangeSumQueryImmutable,preSum,left,LeetCode,out
From: https://www.cnblogs.com/dolphinmind/p/18339550

相关文章

  • 【代码随想录训练营第42期 Day17打卡 二叉树Part5-LeetCode 654.最大二叉树 617.合并
    目录一、做题心得二、题目与题解题目一:654.最大二叉树题目链接题解:递归题目二:617.合并二叉树题目链接题解:递归(前序遍历)题目三:617.合并二叉树题目链接题解:BFS层序遍历 题目四:98.验证二叉搜索树题目链接题解:递归(中序遍历)三、小结一、做题心得今天是代码随想......
  • LeetCode 152 乘积最大子数组
    题目描述给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个32位整数。思路这一题用普通的连续子数组思路求解时有一个问题:子问题的最优解不一定是总体的最优局部解。也就是不满足最优......
  • 【leetcode232:用栈实现队列】
    leetcode232:用栈实现队列题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素booleanemp......
  • LeetCode | 59 SpiralMatrixII
    主类https://github.com/dolphinmind/datastructure/tree/datastructure-array-02循环不变量原则,保证问题边界的逻辑一致性(从二分法的启发)初始位置旋转圈数奇偶性四条边的边界逻辑offsetpackagecom.github.dolphinmind.array;/***@authordolphinmind*@C......
  • [Leetcode]SQL语句
    groupby182.查找重复的电子邮箱SQLSchemaPandasSchema表:Person+-------------+---------+|ColumnName|Type|+-------------+---------+|id|int||email|varchar|+-------------+---------+id是该表的主键(具有唯一值的列)。此......
  • 二叉搜索树,Map,Set,LeetCode刷题
    二叉搜索树,Map,Set1.二叉搜索树2.二叉搜索树的模拟实现1.1插入操作1.2查找操作1.3删除操作3.二叉搜索树时间复杂度分析4.TreeMap和TreeSet5.Map5.1Map的常用方法5.2Map.Entry<K,V>6.Set6.1Set的常用方法LeetCode刷题1.二叉搜索树与双向链表1.二叉搜......
  • LeetCode | 209 MinimumSizeSubarraySum
    分析本题中是找与target相符的最小连续的子数组和,找一个能够容纳target这么大的最小子区间。虽然本节引入了滑动窗口的概念,可我更偏好于,这是一只毛毛虫在数组上的移动,找到最小的容纳自己位置的地方target可看作毛虫本身的重量,数组中的每个元素值表示可承受的重量,right右指针看......
  • LeetCode 322 零钱兑换
    题目描述给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。思路这是一个完全背包问题,背包问题当满足:物品不......
  • 每日一题:Leetcode-48 旋转图像
    力扣题目解题思路java代码力扣题目:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转90度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6]......
  • LeetCode 2024/8 每日一题合集
    2024-7-1LCP40.心算挑战代码实现classSolution{public:intmaxmiumScore(vector<int>&cards,intcnt){intn=size(cards);std::sort(cards.rbegin(),cards.rend());intsum=std::accumulate(cards.begin(),cards.begin()......