当前位置: 首页 > news >正文

【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;}
};
~希望对你有启发~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 24暑假算法刷题 | Day30 | 贪心算法 IV | LeetCode 452. 用最少数量的箭引爆气球,435. 无重叠区间,763. 划分字母区间
  • 常用的麦克劳林级数展开式(泰勒展开式)
  • MapReduce 简单介绍
  • Vue3的多种组件通信方式
  • 解决C++读写中文乱码问题, UTF-8与GBK字符的转换 —基于Windows.h
  • RAR文件密码忘记怎么办?三大RAR密码找回工具推荐
  • 苹果macOS 15 Sequoia投屏功能 实现Mac上iPhone桌面管理
  • Windows下curl报错:curl: (3) unmatched close brace/bracket in URL position x
  • 【现代通信技术】走进现代通信系统架构
  • 海康相机二次开发学习笔记1-环境配置
  • 【2024】k8s集群 图文详细 部署安装使用(两万字)
  • Oracle笔记
  • 二叉树详解(1)
  • 【hexo博客问题】
  • 跨境电商测评网络:美国住宅IP的获取与使用
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • crontab执行失败的多种原因
  • CSS3 变换
  • HTML5新特性总结
  • HTTP 简介
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Map集合、散列表、红黑树介绍
  • Quartz初级教程
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 回顾2016
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 智能合约开发环境搭建及Hello World合约
  • 【干货分享】dos命令大全
  • Nginx实现动静分离
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ‌移动管家手机智能控制汽车系统
  • ![CDATA[ ]] 是什么东东
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #git 撤消对文件的更改
  • #HarmonyOS:Web组件的使用
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (20)docke容器
  • (3)STL算法之搜索
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)字符分类函数
  • (二)c52学习之旅-简单了解单片机
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (每日一问)基础知识:堆与栈的区别
  • (十六)串口UART
  • (算法)Travel Information Center
  • (一) 初入MySQL 【认识和部署】
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转) 深度模型优化性能 调参
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径