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

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/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);*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chunjun纯钧(Flinkx)同步任务开发通用配置参数详解

Chunjun纯钧(Flinkx)是一款稳定、易用、高效、批流一体的数据集成框架,目前基于实时计算引擎Flink实现多种异构数据源之间的数据同步与计算,支持JSON模版配置任务,兼容FlinkSQL语法。本文对chunjun同步任务的配置文件进行详细的介绍和总结。 文章目录 配置文件结构详解Conte…

HackTheBox - Medium - Linux - Ambassador

Ambassador Ambassador 是一台中等难度的 Linux 机器&#xff0c;用于解决硬编码的明文凭据留在旧版本代码中的问题。首先&#xff0c;“Grafana”CVE &#xff08;“CVE-2021-43798”&#xff09; 用于读取目标上的任意文件。在研究了服务的常见配置方式后&#xff0c;将在其…

2023「总结」,2024「展望」

前言 时光荏苒&#xff0c;岁月如梭&#xff0c;转眼已经进入2024年了。回想过去的2023年&#xff0c;成长了很多&#xff0c;有收获&#xff0c;有付出&#xff0c;也有一丝丝的遗憾。   其实在写这篇文章之前我思考了很久&#xff0c;一直不知如何下手&#xff0c;也许这是…

el-select显示不全

css代码&#xff1a; .el-select-dropdown__wrap.el-scrollbar__wrap {margin-bottom: 0 !important; }

nodejs 实现内部之间接口的相互调用

ChatGPT4.0国内站点&#xff1a;海鲸AI 在 Node.js 中调用服务内的接口&#xff0c;通常是指发起 HTTP 请求到某个服务的 API 端点。这可以通过 Node.js 的内置 http 模块来实现&#xff0c;或者使用第三方库如 axios、request&#xff08;已被弃用&#xff09;、node-fetch 等…

Redis 常见的几种数据结构说一下?各自的使用场景?

文章目录 Redis 常见的几种数据结构说一下&#xff1f;各自的使用场景&#xff1f;stringlisthashsorted setbitmap使用场景&#xff1a; Redis 常见的几种数据结构说一下&#xff1f;各自的使用场景&#xff1f; string 介绍&#xff1a;string 数据结构是简单的 key-value …

机器学习笔记 - 用于语义图像分割的空洞卷积DeepLabv3

一、什么是DeepLabv3&#xff1f; DeepLabv3 是用于语义分割任务的深度神经网络 (DNN) 架构。虽然不是比较新的网络模型&#xff0c;但是也是分割模型里的杰出代表之一&#xff0c;所以还是值得深入了解。 它使用Atrous&#xff08;Dilated&#xff09;卷积来控制感受野和特征图…

lucky_number.exe逆向

使用IDA打开lucky_number.exe 在IDA view中找到包含flag的信息。 点击F5进入源码 可以看到程序输入的数据会经过凯撒密码加密后进行与变量aHv1g1gM0ifTzou比较判断。 双击进入这个变量,可以找到比较的字符串Hv1g_1g_M0if_Tzou_v4v4v 知道了加密算法是凯撒加密,我们就可以…

20240106-算术切片 II - 子序列

题目要求 给定一个整数数组 nums&#xff0c;返回 nums 的所有算术子序列的个数。 如果一个数字序列至少由三个元素组成&#xff0c;且任意两个连续元素之间的差值相同&#xff0c;则该序列称为算术序列。 例如&#xff0c;[1, 3, 5, 7, 9]、[7, 7, 7]和[3, -1, -5, -9]都是…

机器学习(四) -- 模型评估(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…

小家电type-c接口PD诱骗

小家电Type-C接口PD诱骗&#xff1a;未来充电的便捷与安全 随着科技的不断发展&#xff0c;Type-C接口已经成为了许多小家电产品的标配。而PD&#xff08;Power Delivery&#xff09;诱骗技术&#xff0c;作为一种新兴的充电技术&#xff0c;更是为小家电产品的充电带来了前所…

MySQL学习笔记1: 数据库的简单介绍

目录 1. 数据库是什么2. 数据库这一类软件中的一些典型代表2.1. Oracle2.2. MySQL2.3. SQL Server2.4. SQLite (lite 轻量版) 3. 数据库的类型3.1. 关系型数据库3.2. 非关系型数据库 4. 总结 1. 数据库是什么 数据库是一类软件&#xff0c;这一类软件可以用来管理数据&#xf…

Freemarker实现Html全站静态化

全站静态化 在大型网站中&#xff0c;比如主流电商商品页&#xff0c;访问者看到的页面基本上是静态页面。为什么都要把页面静态化呢&#xff1f;其实把页面静态化&#xff0c;好处有很多。例如&#xff1a;访问速度快&#xff0c;更有利于搜索引擎收录等。 目前主流的静态化…

复旦MBA :在多元共融中,探寻可持续发展和创新的魅力

复旦MBA的课堂从来不只在复旦校园&#xff1a;从中国到全球&#xff0c;从教室到企业&#xff0c;从每年Global Immersion Program(简称GIP)的美国耶鲁及MIT、UC Berkeley 、英国伦敦商学院、西班牙ESADE商学院、新加坡国立大学、韩国高丽大学等名校寒暑假课程&#xff0c;到Gl…

微服务-java spi 与 dubbo spi

Java SPI 通过一个案例来看SPI public interface DemoSPI {void echo(); } public class FirstImpl implements DemoSPI{Overridepublic void echo() {System.out.println("first echo");} } public class SecondImpl implements DemoSPI{Overridepublic void ech…

如何使用UUP从windows更新服务器下载windows10原版镜像

UUP是指Windows 10中的一种更新技术&#xff0c;全称为Unified Update Platform。UUP的目标是提供更快、更高效的更新体验&#xff0c;它通过增量更新的方式来更新操作系统&#xff0c;只下载和安装实际变化的部分&#xff0c;而不是整个更新包。这样可以节省带宽和时间&#x…

Marvelous Designer 各版本安装指南

Marvelous Designer下载链接 https://pan.baidu.com/s/1ZZCraq6w2Z4JPisND8q0jA?pwd0531 1.鼠标右击【Marvelous Designer 12(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Marvelous Designer 12(64bit)】。 2.打开解压后的…

visi 各版本安装指南

visi下载链接 https://pan.baidu.com/s/1WNksdiChCPebPvRRSVakOA?pwd0531 1.鼠标右键【visi2021(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 visi2021(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup VISI 2…

如何在 Linux 服务器上配置基于 SSH 密钥的身份验证

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Linux 服务器上配置基于 SSH 密钥的身份验证 介绍 SSH是一种加密协议&#xff0c;用于管理服务器并与服…

Java 开源扫雷游戏 JMine 发布介绍视频

Java 开源扫雷游戏 JMine 发布介绍视频 Java 开源扫雷游戏 JMine 是笔者开发的基于 Swing 的 Java 扫雷游戏&#xff0c;现已发布介绍视频。视频请见&#xff1a;https://www.bilibili.com/video/BV1Qe411m7qM/ JMine 比较重视的还原了微软的扫雷游戏。在算法设计中&#xff…