java数据结构与算法刷题-----LeetCode303. 区域和检索 - 数组不可变

Leetcode-303范围和查询---不可变-:Java中Leetcode#303的解决方案 立即下载
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只不过是将多余的步骤,提前放到dp数组中(就是一个数组,只不过大家都叫它dp),达到空间换时间的效果。它仅仅只是一种优化思路,因此它目前的境地和线性代数一样----虚假的难。

  1. 想想线性代数,在国外留学的学生大多数不觉得线性代数难理解。但是中国的学生学习线性代数时,完全摸不着头脑,一上来就是行列式和矩阵,根本不知道这玩意是干嘛的。
  2. 线性代数从根本上是在空间上研究向量,抽象上研究线性关系的学科。人家国外的教科书都是第一讲就帮助大家理解研究向量和线性关系。
  3. 反观国内的教材,直接把行列式搞到第一章。搞的国内的学生在学习线性代数的时候,只会觉得一知半解,觉得麻烦,完全不知道这玩意学来干什么。当苦尽甘来终于理解线性代数时干什么的时候,发现人家国外的教材第一节就把这玩意讲清楚了。你只会大骂我们国内这些教材,什么狗东西(以上是自己学完线性代数后的吐槽,我们同学无一例外都这么觉得)。

而我想告诉你,动态规划和线性代数一样,我学完了才知道,它不过就是研究空间换时间,提前将固定的重复操作规划到dp数组中,而不用暴力求解,从而让效率极大提升。

  1. 但是网上教动态规划的兄弟们,你直接给一个动态方程是怎么回事?和线性代数,一上来就教行列式和矩阵一样,纯属恶心人。我差不多做了30多道动态规划题目,才理解,动态方程只是一个步骤而已,而这已经浪费我很长时间了,我每道题都一知半解不理解,过程及其痛苦。最后只能重新做。
  2. 动态规划,一定是优先考虑重复操作与dp数组之间的关系,搞清楚后,再提出动态方程。而你们前面步骤省略了不讲,一上来给个方程,不是纯属扯淡吗?
  3. 我推荐研究动态规划题目,按5个步骤,从上到下依次来分析
  1. DP数组及下标含义
  2. 递推公式
  3. dp数组初始化
  4. 数组遍历顺序(双重循环及以上时,才考虑)
  5. dp数组打印,分析思路是否正确(相当于做完题,检查一下)

在这里插入图片描述

先理解题目细节

在这里插入图片描述

解题思路
  1. 暴力求解的思想,就是每次都遍历数组,将指定区间的那几个元素相加。
  2. 但是如果我们预先将其存储到dp数组,就可以直接通过dp, 获取数据,而不用枚举。典型的动态规划题目
动态规划思考5步曲
  1. DP数组及下标含义
  1. 先看时间和空间复杂度高的思路:我们要求出的是某个区间的元素和,那么dp数组中存储的就是某个区间元素和。要求出谁的元素和呢?显然是某个区间,那么下标就是代表区间的左右边界,显然,如果这样考虑需要2个下标表示,故这道题的dp数组需要二维数组。例如dp[3][5] = 区间(3,5)的元素和
  2. 但是一个线性区间,我们可以用数学思路,先获取整体的区间和,在去掉多余的。例如(2,5)区间包含在(0,5)中,其中(0,1)区间是我们不需要的。我们只需要保存整个区间,也就是从0开始的区间,然后去掉多余的即可。也就是(2,5) = (0,5) - (0,1)
  1. 递推公式
  1. 很明显,我们只考虑从下标为0的元素开始,到每个边界的元素和。而(0,0)区间只有一个元素,需要特殊考虑。
  1. 起点[0,0]的区间和固定为其本身。F(0) = 其本身
  2. 其余的,都是从0开始到其所在位置的总和,而每个元素前一个位置,都保存了从0开始到它的元素总和。故我们只需要将自己的数值+前面区间的值。F(n) = F(n-1)+其本身的值
  1. 但是别忘了,我们这个dp是抽象处理了的,如果区间要求的是从0开始,那么可以直接用我们这个一维数组的dp返回,但是,如果要的不是从0开始的呢?
  1. 从0开始的区间,直接return dp[n]即可。因为我们dp数组本身保存的就是从0开始到n的区间和
  2. 从left开始的区间(left>0), return dp[n] - dp[left-1]. 例如(2,5)区间,left = 2,我们需要这样获取它:(2,5) = (0,5) - (0,1) === dp[5] - dp[2 - 1]
  1. dp数组初始化

在这里插入图片描述

  1. 数组遍历顺序(单重循环,无需考虑遍历顺序,一共就一维,哪里来的谁先谁后)
  2. 打印dp数组(自己生成dp数组后,将dp数组输出看看,是否和自己预想的一样。)

具体看最上面了解题目细节那里吧。写这篇文章用的学校的电脑,用不了java

代码:时间复杂度初始化dp时O(n),之后查询区间值为O(1).空间复杂度O(n)

在这里插入图片描述

class NumArray {
    private int dp[] = null;//dp数组,一维表示,保存从0开始的区间(0,0),(0,1),(0,2)...(0,n)
    public NumArray(int[] nums) {
        this.dp = new int[nums.length];//让dp数组与nums数组长度保持一致
        this.dp[0] = nums[0];//(0,0)区间只有一个元素值nums[0]
        //保存其余从0开始的区间, 例如(0,1)区间 = (0,0)区间+nums[1]本身
        for(int i = 1;i<nums.length;i++){
            dp[i] = dp[i-1]+nums[i];
        }
    }
    
    public int sumRange(int left, int right) {
        if(left == 0) return dp[right];//如果是从0开始的区间,直接返回dp中的值即可
        else return dp[right]-dp[left-1];//不是从0开始,需要特殊处理,(2,5) = (0,5) - (0,1)
    }
}

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray obj = new NumArray(nums);
 * int param_1 = obj.sumRange(left,right);
 */
SAP交货单增强字段更新实战:手把手教你用BAPI_OUTB_DELIVERY_CHANGE和EXTENSION2参数 本文详细解析了如何使用BAPI_OUTB_DELIVERY_CHANGE和EXTENSION2参数实现SAP交货单增强字段的更新。从增强点SMOD_V50B0001的定位到字段落表的全流程,提供了ABAP代码示例和常见问题排查方法,帮助开发者高效完成交货单自定义字段的集成开发。 阅读详情

相关推荐

ExpressLRS 915MHz vs 2.4GHz:实测对比与TX12遥控器的最佳搭配方案

本文深入对比了ExpressLRS 915MHz与2.4GHz两种频段在穿透能力、延迟、抗干扰等方面的实测表现,并结合RadioMaster TX12遥控器的硬件特性,提供了从微型花飞到极限远航等不同场景下的最佳搭配方案与EdgeTX系统配置指南,帮助FPV玩家根据核心飞行需求做出精准选择。

milk8的博客 447

Java | Leetcode Java题解之第303题区域和检索-数组不可变

Java | Leetcode Java题解之第303题区域和检索-数组不可变

m0_57195758的博客 581

几何非线性-屈曲分析

结构系统的破坏分为两种,一类是因材料软化而引起的强度破坏,另一类是几何软化使得结构的几何形状发生极大变化,从而使结构丧失承载能力。在材料力学中是这样定义压杆失稳的:中心受压直杆(理想模型)在直线状态下平衡,由稳定平衡转化为不稳定平衡时所受的轴向压力的界限值,称为临界压力。中心受压直杆在临界压力的作用下,其直线形态的平衡开始丧失稳定性,简称为失稳。显然,这个定义只使用于理想的压杆模型,那么关于失稳和屈曲是否存在一般性定义呢?

YORU_NO_KUNI的博客 1万+

LeetCode——303.区域和检索-数组不可变(JAVA)动态规划解决

在初始化的时候将数组的所有的数与各自的和与之前的所有的和进行保存,在需要计算i到j的时候我们只需要将新数组中j对应的下标减去i对应的下标即可 package LeetCode.OneToFiveHundred; public class ThreeHundredAndThree { private int [] temp; public ThreeHundredAndThree(...

Rabbit-Sir的博客 260

【点云语义分割】Ubuntu20.04下RangeNet++环境配置与实战指南

本文详细介绍了在Ubuntu20.04系统下配置和运行RangeNet++点云语义分割模型的完整实战指南。内容涵盖从Cuda、cudnn到TensorRT的深度学习环境搭建,RangeNet++源码编译的详细步骤与常见问题解决,以及如何运行首个分割Demo并可视化结果。最后,还探讨了处理自定义点云数据格式和进行性能调优的进阶技巧,旨在帮助开发者和研究者快速部署并应用这一先进的点云语义分割技术。

rnn9storyteller的博客 518

【FDTD运行引擎错误解决方法】

我用的是2024R1版的FDTD,第一次安装好的时候点“RUN”可以正常运行,后来不知道什么问题就无法运行了。我从网上找相关的解决办法,并未找到,将软件卸载重装,重启等方法都没有解决,后来在官网按照提示解决了,我把官网提供的方式和我的情况相结合,提供一个解决方式。提示:以下是本篇文章正文内容,下面案例可供参考最后说一下两个MPI和Local computer(不使用MPI)的区别使用MPI进行仿真可以显著提高计算速度和效率,特别是对于大规模和复杂的仿真任务,但需要额外的设置和配置。(多线程并行计算)

m0_57410975的博客 8176

【LeetCode刷题】303 区域和检索 -数组不可变 java

题目 给定一个整数数组 nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right 实现 NumArray 类: NumArray(int[] nums) 使用数组 nums 初始化对象 int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] +

m0_56698268的博客 957

联想X3650M5服务器双模式切换实战:UEFI与Legacy BIOS如何选择?

本文深入探讨了联想X3650 M5服务器在UEFI与Legacy BIOS启动模式间的选择策略。文章从技术原理、决策矩阵、实战切换步骤及后期验证等方面,为企业IT管理员提供了基于操作系统兼容性、存储架构、安全合规与运维习惯的完整决策框架,帮助其在数据中心硬件生命周期管理中做出明智选择。

weixin_29207533的博客 281

LeetCode303—区间和检索-数组不可变(java版)

题目描述: 标签: 设计 数组 前缀和 给定一个整数数组 nums,求出数组从索引i到j(i≤j)范围内元素的总和,包含i、j两点。 实现 NumArray 类: NumArray(int[] nums) 使用数组 nums 初始化对象 int sumRange(int i, int j) 返回数组 nums 从索引i到j(i≤j)范围内元素的总和,包含i、j两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j])) 代码...

qq_40840749的博客 255

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 407

20、七鳃鳗繁殖与早期生活史:从水质到养殖的全面解析

本文全面解析了七鳃鳗的繁殖与早期生活史,重点探讨了水质对幼体生存的影响、养殖密度与生长关系、变态过程的时间与大小特征,以及人工繁殖在濒危物种恢复和入侵物种控制中的应用。同时,文章分析了大规模养殖面临的挖掘基质需求、空间限制、清洁管理、疾病防控及微生物环境等挑战,并强调实验室养殖对科学研究和种群管理的重要意义。随着技术进步,未来有望扩展更多物种的繁殖研究,揭示七鳃鳗生物学的进化奥秘,实现资源的可持续利用。

l6m7n8的博客 116

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新

本文相当于目录方便快速检索内容,没有实际内容,只做索引 源码(码云):https://gitee.com/yin_zhipeng/data_structures_and_algorithms_in_java.git 文章目录一、堆栈(Stack) 一、堆栈(Stack)

殷志鹏的博客 1114

打破RK3588 GPIO中断响应延迟的枷锁,开启高效编程

本文针对RK3588芯片在智能安防和工业自动化应用中出现的GPIO中断响应延迟问题展开深入分析。通过硬件原理剖析,发现延迟主要源于中断控制器优先级设置、线路干扰等硬件因素,以及中断处理函数复杂、内核调度延迟等软件问题。提出硬件优化方案包括合理布局布线、电源稳定设计,软件层面则通过精准配置设备树、精简中断处理函数、利用工作队列等内核机制进行优化。测试结果显示,优化后中断响应延迟从50-80ms降至10-20ms,高负载下也能稳定在50ms以内。文章最后展望了AI技术在中断调度中的潜在应用价值。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 364

[C++]Leetcode超高效刷题顺序及题目详解笔记(持续更新中)

一.引言 博主最近在LeetCode上用C++练习。一路走来踩过一些坑,做了一些总结和笔记,分享给需要的人。 LeetCode网址:https://leetcode.com/ LeetCode中文版:https://leetcode-cn.com/ 二.刷题指南 LeetCode 是一个非常棒的平台,收集了许多公司的面试题目。相对其他平台而言,有着下面的几个优点: 题目全部来自业内大公司的真实面试不用处理输入输出 精力全放在解决具体问题上题目有丰富的讨论 可以参考别人的思路精确了解自己代码在所有提交代码中

cpb____的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

力扣刷题系列-303. 区域和检索 - 数组不可变

力扣刷题系列-303. 区域和检索 - 数组不可变题干题目分析代码实现 题干 原题链接 输入: [“NumArray”, “sumRange”, “sumRange”, “sumRange”] [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]] 输出: [null, 1, -1, -3] 解释: NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]); numArray.sumRange(0, 2);

qq_43162928的博客 289

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LeetCode打卡每日一题——303. 区域和检索 - 数组不可变

303 区域和检索 - 数组不可变(难度:简单) 文章目录前言一、题目描述1.示例①二、解题思路1.题目分析2. 代码示例3. 代码讲解总结 前言 偶然一天看到同事在用LeetCode(力扣)这个网站,我也因此而发现了一个“新大陆”。 首先先简单的介绍一下力扣这个网站,它是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。源自美国硅谷,力扣为全球程序员提供了专业的IT技术职业化提升平台,有效帮助程序员实现快速进步和长期成长。 最近也是一直在力扣打卡,每天一道算法题,借此机会也与大家分享一下。

不肯过江东丶 1532

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java实现 LeetCode 303 区域和检索 - 数组不可变

303. 区域和检索 - 数组不可变 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 示例: 给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange() sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> ...

南 墙 1万+

【简单】力扣算法题解析LeetCode303:区域和检索-数组不可变

LeetCode 303题解:前缀和优化区间查询 这道题要求高效处理数组的多次区间求和查询。通过构建前缀和数组,将查询时间复杂度从O(n)降至O(1)。初始化时计算前缀和数组prefixSum,其中prefixSum[i]表示前i个元素的和。查询时只需用prefixSum[right+1]-prefixSum[left]即可得到结果。

ylumwd的博客 460

Leetcode 303 区域和检索 - 数组不可变 C++,Java,Python

Leetcode303 区域和检索 - 数组不可变 C++,Java,Python 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/range-sum-query-immutable/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给定一个整数数组 nums,求出数组从索引 i 到 j ...

Rp的博客 427

Leetcode 303.区域和检索——数组不可变

Leetcode 303.区域和检索——数组不可变 区域和检索 - 数组不可变 给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。 实现 NumArray 类: NumArray(int[] nums) 使用数组 nums 初始化对象 int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], ... ,

EIUC_Thread的博客 184

Leetcode 303 区域和检索 - 数组不可变 (Java)

题目描述 Leetcode 303 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 示例:给定 nums = [-2, 0, 3, -5, 2, -1], 求和函数为 sumRange() sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> ...

曾经 490

leetcode - 303.区域和检索-数组不可变(动态规划)

303.区域和检索-数组不可变 —————————————————————————————————————————— 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 示例: 给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange() sumRange(0, 2) -> 1 sumRa...

然后就去远行 341

刷题小记:第303题--区域和检索(数组不可变)[前缀和]

文中详细解释了前缀和的概念:通过构建长度+1的辅助数组存储累加和,优化实现了O(1)时间复杂度的解法解决303题。

zhiyu2024的博客 360

leetcode-区域和检索 - 数组不可变

文章目录题目代码其他优秀代码 题目 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 示例: 给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange() sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -...

lingle1的博客 362
上一篇: java数据结构与算法刷题-----LeetCode64. 最小路径和
下一篇: java数据结构与算法刷题-----LeetCode343. 整数拆分(TODO)
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值