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

力扣1477. 找两个和为目标值且不重叠的子数组

在这里插入图片描述
在这里插入图片描述
这一题观察数据范围和题目可以知道是应用到前缀和加哈希,正常的思路走即可,但关键点就在于如何实现数组的不重叠,我原想的方案是枚举出符合条件的子数组后,记录它的起始位置,新再枚举的子数组不能处于这个区间内,但这样就忽略了这个重复的数组可能要比之前的数组的长度小,如果不保存这个重叠的子数组,去更新最终两个子数组的长度和时一定会出错,而且子数组不定长,可能是在后面枚举的子数组比前面的要长些,总之不管怎样我们都无法实现对重叠的子数组的有效处理。
看题解后我才明白,解决重叠子数组的关键在于我们用一个dp【】表,每一个索引表示在该位置之前的最小的子数组的长度,这样就避免了对重复子数组的讨论,我们不需要关注两个子数组是否重叠,只需要把一个位置的前面的最小的子数组的长度统计出来即可,有可能在该位置之前有两个子数组是重叠的,但那又何妨,我们只需要判断它们谁长度最小,保存到dp表中即可,这样我们一边的枚举新的子数组,一边的更新新的子数组前面的子数组的长度的最小值这其实也是左维护右枚举的一种思想吧。

class Solution {
public:int sum[100005];
unordered_map<int,int> mp;int minSumOfLengths(vector<int>& arr, int target) {int leftmin[100005]; for(int i=0;i<=arr.size();i++){leftmin[i]=INT_MAX;}for(int i=0;i<arr.size();i++){sum[i+1]=sum[i]+arr[i];}mp[0]=0;//sum[j+1]-sum[i]=targetint ans=INT_MAX;for(int j=0;j<arr.size();j++){leftmin[j+1]=leftmin[j];if(mp.count(sum[j+1]-target)){//如果从哈希表中找到该位置之前存在一个子数组,使他满足条件int start=mp[sum[j+1]-target]+1;int len=j+1-start+1;if(start>0){if(leftmin[start-1]!=INT_MAX){ans=min(ans,leftmin[start-1]+len);}leftmin[j+1]=min(leftmin[j+1],len);} }mp[sum[j+1]]=j+1;}if(ans==INT_MAX){return -1;}elsereturn ans;}
};

时间复杂度O(n),涉及到了一些动态规划的思想但其实还算好理解的。

相关文章:

  • IEEE5节点系统潮流仿真模型(simulink+matlab全功能模型)
  • MySQL误删数据急救指南:基于Binlog日志的实战恢复详解
  • Vue3 + TypeScript + xlsx 导入excel文件追踪数据流转详细记录(从原文件到目标数据)
  • 编程基础:调用访问
  • pyqt事件过滤器eventFilter
  • 计算机网络学习笔记:应用层概述、动态主机配置协议DHCP
  • ProtoBuf:proto3 语法详解
  • 软件工程期末试卷填空题版带答案(共40道)
  • 华为云 Flexus+DeepSeek 实战:华为云Dify 平台 CCE 高可用集群部署与大模型知识库构建指南
  • C++链表的虚拟头节点
  • 【unity游戏开发——热更新】YooAsset简化资源加载、打包、更新等流程
  • 【设计模式】6.原型模式
  • 获取 Git 仓库
  • 第三章 线性回归与感知机
  • 面试题-ts中的typeof
  • ACL 2025 Findings | 无监督概念发掘,提高文本解释的可理解性
  • 如何排查在docker中运行软件的故障:Docker故障排查可视化指南,三招锁定问题根源
  • 从0到1学Linux:Linux进程
  • BGP路由反射器(RR)实验详解,结尾有详细脚本
  • 【软考高级系统架构论文】论湖仓一体架构及其应用
  • 三维立体网站建设/欧洲网站服务器
  • 免费下载的网页模板/seo chinaz
  • 网站流量显示/网站按天扣费优化推广
  • 深圳外贸营销型网站建设/百度seo网站优化 网络服务
  • 广告行业网站建设方案/优化关键词是什么意思
  • 淘宝电商平台网站/如何推广网址链接