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

2024-05-07 11:32

本文主要是介绍1477. 找两个和为目标值且不重叠的子数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

      • 题目描述 :
          • 样例1:
          • 样例2:
          • 样例3:
          • 样例4:
          • 示例 5:
          • 提示:
      • 解题思路:
      • 代码实现:

题目描述 :

给你一个整数数组 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 的最短的数组lenvector<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 的最短的数组lenvector<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-/

这篇关于1477. 找两个和为目标值且不重叠的子数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967228

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代