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

2023-11-08

题目描述 :

给你一个整数数组 arr 和一个整数值 target 。

请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target 。可能会有多种方案,请你返回满足要求的两个子数组长度和的 最小值 。

请返回满足要求的最小长度和,如果无法找到这样的两个子数组,请返回 -1 。

样例1:
输入:arr = [3,2,2,4,3], target = 3
输出:2
解释:只有两个子数组和为 3 ([3] 和 [3])。它们的长度和为 2 。
样例2:
输入:arr = [7,3,4,7], target = 7
输出:2
解释:尽管我们有 3 个互不重叠的子数组和为 7 ([7], [3,4] 和 [7]),但我们会选择第一个和第三个子数组,因为它们的长度和 2 是最小值。
样例3:
输入:arr = [4,3,2,6,2,3,4], target = 6
输出:-1
解释:我们只有一个和为 6 的子数组。
样例4:
输入:arr = [5,5,4,4,5], target = 3
输出:-1
解释:我们无法找到和为 3 的子数组。
示例 5:
输入:arr = [3,1,1,1,5,1,2,1], target = 3
输出:3
解释:注意子数组 [1,2] 和 [2,1] 不能成为一个方案因为它们重叠了。
提示:
1 <= arr.length <= 10^5
1 <= arr[i] <= 1000
1 <= target <= 10^8

解题思路:

首先是确定边界,相当于将字符串切割为两个部分,左边找到一组值为target ,右边找到一组值为target;len(左边) + len(右边) 最小的那一个就是所要的结果。

每一部分每个位置在找到最小的len值即可; 递归的思路
以i 为右边界 (左->右): i in (0,arr.size() - 1 ) len(0 - i) = min (len(0 -> i - 1),len(0->i)) ;
同理 以 i 为左边界 (右->左) i in (0,arr.size() - 1) len(arr.size() - 1 -> i) = min (len(arr.size() - 1 -> i - 1),len(arr.size() - 1 -> i)) ;

在这里插入图片描述

代码实现:

class Solution {
public:
    int minSumOfLengths(vector<int>& arr, int target) {
       int i , j ;
    int ret = 200000 ;

    int leftI = 0 , rightE = arr.size() - 1;
    int sumR = 0 ;

    // 以 j当前值为左侧的端点,在 j - arr.size() - 1 之间 寻找 == target 的最短的数组len
    vector<int> rightMin(arr.size() , 200000) ;
    for (j = rightE ; j > -1 ; j --)
    {
        sumR += arr[j] ;

        while (sumR > target)
        {
            sumR -= arr[rightE] ;
            rightE -- ;
        }

        if (sumR == target)
        {
            if (j != arr.size() - 1)
                rightMin[j] = rightMin[j + 1] > (rightE - j + 1) ? (rightE - j + 1) : rightMin[j + 1] ;
            else {
                rightMin[j] = rightE - j + 1 ;
            }
        }
        if (j != arr.size() - 1)
            rightMin[j] = rightMin[j] > rightMin[j + 1] ? rightMin[j + 1] : rightMin[j] ;//
    }


    // 以 i当前值为右侧的端点,在 0 - i 之间 寻找 == target 的最短的数组len
    vector<int> leftMin(arr.size(), 200000) ;
    sumR = 0 ;
    for (i = 0 ; i < arr.size() ; i ++)
    {
        sumR += arr[i] ;

        while (sumR > target)
        {
            sumR -= arr[leftI] ;
            leftI ++ ;
        }

        if (sumR == target)
        {
            if (i != 0)
                leftMin[i] = leftMin[i - 1] > (i - leftI + 1) ? (i - leftI + 1) :leftMin[i - 1] ;
            else leftMin[i] = i - leftI + 1 ;
        }
        if (i != 0)
            leftMin[i] > leftMin[i - 1] ? leftMin[i - 1] : leftMin[i] ;
    }

    for (i = 0 ; i < arr.size() -  1 ; i ++)

        ret = ret > (leftMin[i] + rightMin[i + 1]) ? (leftMin[i] + rightMin[i + 1]) : ret ;
    if (ret >= 200000)
        return - 1 ;
    else return ret ;
    }
};

作者:tsmart
链接:https://leetcode-cn.com/problems/find-two-non-overlapping-sub-arrays-each-with-target-sum/solution/zhao-liang-ge-he-wei-mu-biao-zhi-qie-bu-zhong-die-/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1477. 找两个和为目标值且不重叠的子数组 的相关文章

  • 期货价格的技术分析及原理

    一 基本分析与技术分析比较 一 技术分析及其特点 技术分析基于市场交易行为本身 通过分析技术数据来对期货价格走势做出预测 技术数据的表现形式主要是各种图形和指标 其实质内容主要是价格和数量 1 技术分析以三项基本假设为前提 1 包容假设 技

随机推荐

  • DCDC常见问题之输出带载问题

    DCDC常见问题之输出带载问题 DCDC在目前的电子产品中使用越来越常见 但是出来的问题也越来越多 下面我们将介绍DCDC输出常见的问题 该问题是一个系列 今天我们介绍的是DCDC设计时 空载下一切正常 但是带载时 输出电压出现波动等各种问
  • 【非常重要】discuz修改默认首页【自定义手机跳转页面】设置为门户页portal.php(解决设置后手机端portal跳转至forum)

    参考文章 https blog csdn net weixin 38787928 article details 87915519 注意 访问手机端发现进入门户页 portal php 后自动跳转至论坛 forum php 时 请打开 so
  • layui选项卡切换及右键的动态操作(新增、切换、删除)

    先来看个效果图 文章底部有gitee地址 要实现的效果 选项卡的新增以及切换 选项卡刷新 选项卡各种删除 删除其他 删除右侧所有 删除所有 OK 直接上代码 一些引入文件就不写了 这里只列出主要的代码 有需要的话可以去Gitee自行下载 布
  • 我开了个游戏,为什么老是被人攻击呀,怎么才能防止这个情况

    很多游戏从业者都会遇到被恶意攻击的情况 那么为什么网络上会有这种情况出现呢 一种是同行的恶意竞争 当你们开着差不多类型的游戏时 那么同行觉得你的人气比较旺 就会想办法攻击你的游戏 这样你的游戏服务器陷入宕机的话玩家就有可能流失 毕竟对玩家而
  • QT 数字转字符串自动补0或者空格,arg()的用法

    十六进制 前面自动补0 QString str QString 1 arg outChar 0xFF 2 16 QLatin1Char 0 int a 0001 十进制 前面自动补0 QString str QString 1 arg a
  • 【双指针】---反转链表

    题目 提供单向链表的头节点head 请反转链表 并返回反转后的链表 分析 同速指针 链表上两个指针 一个先出发 另一个后出发并以相同的速度跟随 通过临时指针让双指针同步前行 思路 源码 package org example pointer
  • 【UE4】蓝图结构体入门及案例

    结构体 结构体是什么 UE4中存在许多不同的变量类型 浮点 布尔 整数 字符串 等等 我们赋予变量意义 用于处理程序的运行 在需要很多意义相同的数据时 我们会应用数组的概念来储存一系列相同类型的数据 但是对于数组中的元素 其的类型是固定不变
  • CVE-2023-3836:大华智慧园区综合管理平台任意文件上传漏洞复现

    文章目录 CVE 2023 3836 大华智慧园区综合管理平台任意文件上传漏洞复现 0x01 前言 0x02 漏洞描述 0x03 影响范围 0x04 漏洞环境 0x05 漏洞复现 1 访问漏洞环境 2 构造POC 3 复现 CVE 2023
  • Java学习----习题总结

    今日习题总结如下 TCP IP分层协议栈 TCP IP协议栈参考模型分为五个层次 应用层 传输层 网络层 链路层和物理层 应用层 是网络应用程序及其应用层协议存留的层次 该层包括了所有与网络相关的高层协议 如文件传输协议 FTP 超文本传输
  • 树莓派上开热点(AP)的三种办法实践结果V2

    树莓派上开热点 AP 的三种办法实践结果 date 2021 08 02 lastmod 2021 09 19 背景 UC2 项目中树莓派大脑和子模块有两种方式连接方式 一种是采用 I2C 总线通过 Arduino 做主从 一种是走 WIF
  • Spring(二)IoC 容器

    IoC 容器 Spring 容器是 Spring 框架的核心 容器将创建对象 把它们连接在一起 配置它们 并管理他们的整个生命周期从创建到销毁 Spring 容器使用依赖注入 DI 来管理组成一个应用程序的组件 这些对象被称为 Spring
  • Arcesium面试体验

    回合 1 能力和技术回合 第一轮有20个Aptitude MCQ 20分钟 和15个技术MCQ 15分钟 分别带有 1和 0 25标记方案 MCQ涵盖了所包含的主题 DSA 操作系统 C C Java基础知识 此后 有2个编码问题 45分钟
  • FFT(快速傅里叶变换)算法

    文章目录 功能 一次FFT的功能 一次IFFT的功能 总体功能 前置技能 多项式的阶 多项式的系数表达式 多项式的点值表达式 复数 复数的基本单位 复数的运算 复平面 复根 定义 几个性质 求多项式乘积的基本步骤 FFT 递归版FFT 核心
  • 【经验分享】Hydra(爆破神器)使用方法

    这个也是backtrack下面很受欢迎的一个工具 参数详解 R 根据上一次进度继续破解 S 使用SSL协议连接 s 指定端口 l 指定用户名 L 指定用户名字典 文件 p 指定密码破解 P 指定密码字典 文件 e 空密码探测和指定用户密码探
  • 大数据Hadoop完全分布式及心得体会

    文章目录 前言 认识hadoop 根据所学知识完成作业 并总结本学期心得体会 一 认识hadoop 二 一课一得作业讲解 实现步骤 1 搭建集群 2 模拟生成新能源车辆数据编写一个程序 3 最终部署 将这些数据写到HDFS中 三 学习收获
  • 概率论中 PDF,PMF,CDF的含义

    概率论中 PDF PMF CDF的含义 在概率论中 我们经常能碰到这样几个概念PDF PMF CDF 这里就简单介绍一下 PDF 概率密度函数 probability density function 在数学中 连续型随机变量的概率密度函数
  • vue的el-form-item标签的label展示名称左右对齐

    vue的el form item是下面的样子
  • 报错Failed to load resource: net::ERR_FILE_NOT_FOUND--浏览器设置跨域

    浏览器报错Failed to load resource net ERR FILE NOT FOUND代表此应用运行需要做跨域 推荐使用火狐浏览器做跨域 之后也用火狐访问 在地址栏输入 about config 点击接受风险并继续 输入se
  • xxl-rpc remoting error(connect timed out), for url : http://172.26.112.1:9999/run

    查看你部署的xxl job admin程序是否部署在外网的 如果是在外网 外网访问不到本地局域网主机 可以使用内网穿透 然后在执行器那里不使用自动获取地址 手动把穿透的地址填进去
  • 1477. 找两个和为目标值且不重叠的子数组

    1477 找两个和为目标值且不重叠的子数组 题目描述 样例1 样例2 样例3 样例4 示例 5 提示 解题思路 代码实现 题目描述 给你一个整数数组 arr 和一个整数值 target 请你在 arr 中找 两个互不重叠的子数组 且它们的和