【leetcode图文详解】特殊数组II : 空间换时间的“记忆化”,越多越好吗?

题目详解
需求:判断给定区间内的元素是否满足“特殊数组”要求
尝试: 暴力求解?
如果试着直接对每个queries中的区间进行检测而不做其他处理,那么最后不出意外地超时了。。

细想优化策略,不难察觉到其中可能存在大量的重复运算
那还等什么(doge)?记忆化!
记忆化
设置rem数组,rem[ i ] = k 意味着nums从 i 到 k 的元素均满足“特殊数组”要求
int *rem = (int *)calloc(sizeof(int), sz+1);
//更新rem示例:
for(int m=st; m<=ed; m++) rem[m] = ed;
一个错误想法:
不妨思考,下面利用 rem 的记录判断符合“特殊数组”的考虑,完善吗?
int st = queries[i][0];//起始位置
int ed = queries[i][1];//终止位置
if(rem[st] != 0 && rem[ed] != 0) return true;
答案是否定的,比如下面这种情况,就会漏掉中间绿色部分的检验。

那怎么办嘞?
其实不难,只要再加上rem值相等的条件就好啦~
if(rem[st] != 0 && rem[ed] != 0 && rem[st] == rem[ed]) return true;
记忆化,越多越好吗?
按理说,后面的思路应该就很清楚了,只要根据 rem[st] 和 rem[ed] 取值的不同情况,分别检验 & 记忆化处理即可。
但写完提交,虽然AC了,但是,本以为记忆化能大大提升时间效率的我,却碰上远低于平均值的结果。

其实,边写的时候,笔者也隐约感觉有些重复,毕竟更新rem的过程本身就是耗费时力的
于是,笔者试着注释掉一些记忆化操作,保留了两处较为主要的部分,果然,去掉了部分记忆化,反倒轻松多了~

// 虽然跟大佬们比起来还是差很多(小声),后面笔者会去学习一下优秀代码,再写篇解读文章~
AC代码见下
// 由于分类讨论较多,显得有点冗长(小声)
class Solution {
public:vector<bool> isArraySpecial(vector<int>& nums, vector<vector<int>>& queries) {int sz = nums.size();int *rem = (int *)calloc(sizeof(int), sz+1);vector<bool>ret;//返回数组//遍历 queriesfor(int i=0; i<queries.size(); i++){int st = queries[i][0];int ed = queries[i][1];if(rem[st] != 0 && rem[ed] != 0 && rem[st] == rem[ed]) ret.push_back(true);else if(rem[st] != 0){st = rem[st];int j=st+1;for(; j<=ed; j++){if(nums[j]%2 == nums[j-1]%2) {ret.push_back(false);break;}}if(j > ed) ret.push_back(true);}else if(rem[ed] != 0){for(int k=st+1; k<=ed; k++){if(nums[k]%2 == nums[k-1]%2) {ret.push_back(false); break;}if(rem[k] == rem[ed]){ret.push_back(true);//记忆化for(int m=st; m<=k; m++)rem[m] = rem[ed];break;}}}else{int k=st+1;for(; k<=ed; k++){if(nums[k]%2 == nums[k-1]%2){ret.push_back(false); break;}if(rem[k] != 0) k = rem[k];}if(k > ed){ret.push_back(true); //记忆化for(int m=st; m<=ed; m++)rem[m] = ed;}}}return ret;}
};
~希望对你有启发~
相关文章:
【leetcode图文详解】特殊数组II : 空间换时间的“记忆化”,越多越好吗?
题目详解 需求:判断给定区间内的元素是否满足“特殊数组”要求 尝试: 暴力求解? 如果试着直接对每个queries中的区间进行检测而不做其他处理,那么最后不出意外地超时了。。 细想优化策略,不难察觉到其中可能存在大量的重复运算 那还等什…...
离线安装prometheus与Grafana实现可视化监控
简介 prometheus 是一个专为云环境设计的开源系统监控和警报工具,它收集并存储多维度的时间序列数据,通过PromQL查询语言提供强大的数据检索能力,并支持可视化及警报功能。而 Grafana 则是一个开源的数据可视化平台,能够与包括Pr…...
【Python学习-UI界面】PyQt5 小部件7-QSpinBox 计数器
样式如下: 一个 QSpinBox 对象向用户呈现一个文本框,右侧有一个上下按钮,显示一个整数。如果按下上下按钮,文本框中的值将增加/减少。 默认情况下,框中的整数从0开始,最高到99,并以步长1变化。对于浮点数…...
[二次元]个人主页搭建
文章目录 域名买一个免费的 框架HexoHexo-Theme-ParticleX Halo 参考 域名 买一个 有钱人玩这个 免费的 github.io 教程在github官方文档有; 框架 Hexo 静态的 Hexo-Theme-ParticleX Argvchsの小窝 Halo 动态的 halo 参考 基于Hexo框架的GitHub个人主页…...
Spring Data JPA 自动创建时间的相关注解和用法
以Springboot项目为例 在实体类上加上注解 EntityListeners(AuditingEntityListener.class)在相应的字段上添加对应的时间注解 LastModifiedDate 和 CreatedDateApplication启动类中添加注解 EnableJpaAuditing...
Java基础之隐式类型转换
类型转换 基本数据类型表示范围大小排序: 在变量赋值及算术运算的过程中,经常会用到数据类型转换,其分为两类: 隐式类型转换 显式类型转换 1 隐式类型转换 情形1:赋值过程中,小数据类型值或变量可以直…...
【数据结构与算法 | 图篇】Dijkstra算法(单源最短路径算法)
1. 前言 由图: 如果我们想要求得节点1到节点5(也可以是其他节点)的最短路径,我们可以使用Dijkstra算法。 2. 步骤与思路 1. 将所有顶点标记为未访问(顶点类的visited属性设置为false)。创建一个未访问顶点的集合。 2. 为每个顶…...
windows c转linux c要做的事情。
写在开头: 最近的copy项目要转到windows版本了,一直在跟进做这个事情。 直入主题说下移植过程中可能涉及以下几个方面的调整: 编译器和工具链的更改:Windows和Linux使用不同的编译器和工具链,因此需要在Windo…...
【高等代数笔记】002.高等代数研究对象(二)
1. 高等代数的研究对象 1.4 一元高次方程的求根 a n x n a n − 1 x n − 1 . . . a 1 x a 0 0 a_{n}x^{n}a_{n-1}x^{n-1}...a_{1}xa_{0}0 anxnan−1xn−1...a1xa00 等式左边是一元多项式。 所有一元多项式组成的集合称为一元多项式环。...
ubuntu服务器部署的mysql本地连不上的问题
试过了网上的所有方法,都连不上,可以执行: SELECT user, host, plugin FROM mysql.user WHERE user root; 查一下:plungin这个连接插件是不是auth_socket, auth_socket是只能本地连接的插件,需要修改: ALTER USER root% IDENTIFIED WITH mysql_native_password BY your_pass…...
python redis安装
python redis安装 #方法1、 sudo apt-get install redis-server python 支持包: (其实就一个文件,搞过来就能用) sudo apt-get install python-redis #方法2、 sudo pip install redis...
YJ0043定制版抖音电商卷抢购系统带回收商城抖音电商优惠卷投资理财系统
系统是基于逍遥商城二开的系统,pc手机端都新增了邀请码验证 手机端重新定制的UI,前端产品不至于抖音卷也可以自行更改其他产品 用户前端下单,后台订单可以直接回收,后台支持设置默认邀请码和抢卷时间限制...
如何选择图片和视频
文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择视频文件"相关的内容,本章回中将介绍如何混合选择图片和视频文件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我…...
html+css网页制作 电商华为商城首页 ui还原度100%
htmlcss网页制作 电商华为商城首页 ui还原度100% 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码…...
EDAS(企业级应用服务)
1 :介绍 1:edas 提供了应用,开发,部署,监控,运维。同时支持 spring cloud, dubbo ,HSF 2:Ali-Tomcat 基于tomcat改造的Servlet容器。支持原有功能,它在启动时会自动加载Pandora(潘多拉&#x…...
简单工厂,工厂方法 和 抽象工厂
这三种模式, 都是创建类型的模式, 将对象的创建流程封装起来供客户调用 简单工厂模式 简介: 和策略模式一样,就是针对不通的参数, 返回不通的实例而已 问题: 没有遵循开闭原则, 如果我们想增加一种类, 那…...
python 压力测试脚本
需求: 生成一个12位不重复的随机数将随机数赋值给Json 串中的 orderCode字段将Json用ECB 指定 key为bJXQezYtR4ZSNK4p进行加密并作为值传给{ “data”: “” }设置每秒30个并发持续1分钟调用接口接口输出测试测试报告 代码示例 import json import random import…...
【Linux】多线程7——线程池
1.线程池的概念 1.1.池化技术 池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 在系统开发过程中,我们经常会用到池化技术。通俗的讲,池化技术就是:把一些资源预先分配好,组织到对象池中…...
Linux Shell实例
1.查空行 答案: awk /^$/{print NR} file1.txt#awk:一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析#处理。 #1)基本语法 #awk [选项参数]/pattern1/{action1} /pattern…...
Linux~MySQL数据库具体操作
一、数据库的字符集编码设置 (一)查看数据库默认的字符集 MariaDB [(none)]> show variables like %character%; ------------------------------------------------------ | Variable_name | Value | ------------…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
