Leetcode 1546. Maximum Number of Non-Overlapping Subarrays With Sum Equals Target

  • 题目描述
  • 思路
  • 周赛代码
  • 优化代码
  • 复杂度分析

题目描述

Given an array nums and an integer target.

Return the maximum number of non-empty non-overlapping subarrays such that the sum of values in each subarray is equal to target.

Example 1:

Input: nums = [1,1,1,1,1], target = 2
Output: 2
Explanation: There are 2 non-overlapping subarrays [1,1,1,1,1] with sum equals to target(2).
Example 2:

Input: nums = [-1,3,5,1,4,2,-9], target = 6
Output: 2
Explanation: There are 3 subarrays with sum equal to 6.
([5,1], [4,2], [3,5,1,4,2,-9]) but only the first 2 are non-overlapping.
Example 3:

Input: nums = [-2,6,6,3,5,4,1,2,8], target = 10
Output: 3
Example 4:

Input: nums = [0,0,0], target = 0
Output: 3

Constraints:

1 <= nums.length <= 105
-104<= nums[i] <= 104
0 <= target <= 106

题目是给定了一个数组,求不重叠的求和为target的子数组最多同时存在多少个。从数据规模来看,数组最长是10万,算法的复杂度一定是o(nlogn)或者更低。n2肯定是过不了的。

思路

一般求解子数组和的题目首先考虑前向累计和(presum)。如果当前的presum是s,那我们只需要找此前有没有出现一个presum是s - t(t代表target,简写一下),那么就存在一段子数组以当前数字结尾并且满足和是t。此前presum是s-t出现过的位置可能有多个,取哪个呢?回答是取最后出现的那个。很容易看出来的一个结论就是长度越长,最后的结果有机会越大。如果前m个数字就能找出最多有k个满足条件的不重叠数组。那前m+1个数字肯定不会比前m个数字得出的结果差,至少满足前m个数的那个最优解在前m+1个数字里还是一个可行解。所以随着长度的增加,res的值只可能单调不减。

在当时做周赛的时候我想到是用hash map配合dp求解
dp[i]表示前i个数能求到的最优解,根据前面描述,dp[i]的值一定是单调不减
index[presum]表示上一个presum出现的位置

周赛代码

const int N = 1e5 + 10;
//dp[i]表示前i个数字能得到的最优解
int dp[N];
class Solution {public:int maxNonOverlapping(vector<int>& nums, int t) {memset(dp, 0, sizeof dp);unordered_map<int, int> index; //key是index, value是[0,key]这个范围能求出的最大值int n = nums.size();index[0] = -1;int s = 0; //这个是presumint res = 0;for ( int i = 0; i < n; ++i ) {s += nums[i];if ( index.count(s - t) ) {//这里写index[s-t]+1是因为dp[i]表示的是前i个数,和index有1个偏移res = max(res, dp[index[s - t] + 1] + 1);}index[s] = i;dp[i + 1] = res;}return res;}
};

这段代码的思路是先找到s-t上一次出现的位置,用那个位置的最优解来计算当前的可能最优解。

优化代码

看了discuss里面的高票答案,发现自己的周赛代码中有一些冗余,周赛代码中是通过presum找到index,然后根据index来找之前的最优解。其实没这个必要,index这一步完全可以省去,只需要记录下来当前累计和捆绑的最优解是多少就可以了。就算之前出现过当前的presum,那当前的也一定不会比之前的差(单调性结论),更何况每次查找s - t,都是查找最后出现的那个,因为最后出现的那个覆盖的范围最大。

class Solution {public:int maxNonOverlapping(vector<int>& nums, int t) {unordered_map<int, int> sum; //key是presum, value是这个presum对应的最优解int n = nums.size();sum[0] = 0;int presum = 0;int res = 0;for ( int i = 0; i < n; ++i ) {presum += nums[i];if ( sum.count(presum - t) ) {res = max(res, sum[presum - t] + 1);}sum[presum] = res;}return res;}
};

复杂度分析

时间空间都是o(n)

这题本质上和2 sum差不多,利用res单调性可以使用贪心。

LeetCode 第201次周赛 1546. Maximum Number of Non-Overlapping Subarrays With Sum Equals Target相关推荐

  1. LeetCode 第 201 场周赛(304/5614,前5.42%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5483. 整理字符串 easy 2. LeetCode 5484. 找出第 N 个二进制字符串中的第 K 位 medium 3. Lee ...

  2. Leetcode 第 201 场周赛 (2020 滴滴校招专场)

    整理字符串 找出第N个二进制字符串中的第K位 和为目标值的最大数目不重叠非空子数组数目 切棍子的最小成本 3分 简单 4分 中等 6分 中等 7分 困难 √ √ √ √ 5483 统计好三元组 用栈维 ...

  3. 【Leetcode】1526. Minimum Number of Increments on Subarrays to Form a Target Array(配数学证明)

    题目地址: https://leetcode.com/problems/minimum-number-of-increments-on-subarrays-to-form-a-target-array ...

  4. LeetCode Subarray Sum Equals K

    原题链接在这里:https://leetcode.com/problems/subarray-sum-equals-k/description/ 题目: Given an array of integ ...

  5. leetcode 330. Patching Array | 1798. Maximum Number of Consecutive Values You Can Make

    1798. Maximum Number of Consecutive Values You Can Make | 1798. 你能构造出连续值的最大数目 https://leetcode.com/p ...

  6. LeetCode——1937. 扣分后的最大得分(Maximum Number of Points with Cost)[中等]——分析及代码(Java)

    LeetCode--1937. 扣分后的最大得分[Maximum Number of Points with Cost][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 ( ...

  7. LeetCode 414. Third Maximum Number

    题目: Given a non-empty array of integers, return the third maximum number in this array. If it does n ...

  8. C#LeetCode刷题之#414-第三大的数(Third Maximum Number)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3710 访问. 给定一个非空数组,返回此数组中第三大的数.如果不存 ...

  9. LeetCode | 414. Third Maximum Number

    . 题目 Given an integer array nums, return the third distinct maximum number in this array. If the thi ...

最新文章

  1. linux 报错 ip_conntrack version 2.4 (8192 buckets, 65536 max) - 304 bytes per conntrack 解决方法
  2. 推荐一个非常COOL的开源相册程序!
  3. c语言输出最后不带空格,新人提问:如何将输出时每行最后一个空格删除
  4. **kwargs特有的作用
  5. 2018.8.14-C++复习笔记总
  6. 电信服务器维修人员职责,维修人员岗位职责
  7. ArrayList扩容
  8. 不要为了“分库分表”而“分库分表”
  9. 泸州市的电子计算机学校名称,泸州电子计算机机械学校2020年招生简介
  10. maven项目转换为web项目
  11. sqlserver 两个数值字段相加_SQLServer 中多行数据合并成一行数据(一个字段)
  12. 用php动态创建图像,php利用imagecreatetruecolor动态生成高清图片代码
  13. 实战Node:Node实现留言板
  14. 大一计算机文化基础复习资料,转 大一计算机文化基础试题及答案
  15. WordPress插件/WP资源下载管理插件 1.3.4
  16. 单片机USB2.0高速接口实现方案
  17. Java成员方法getinfo_Java Swagger.getInfo方法代码示例
  18. Redis集群的节点通信原理
  19. python设置代理_python使用代理proxy
  20. Ubuntu20.04环境下samba无法被小米摄像头搜索到的解决方案

热门文章

  1. 毕设进度跟踪之开题报告
  2. 100 道 Linux 笔试题,能拿 80 分就算运维大神!
  3. 智科人之人工智能课程上机实验(智科还单独有一个综合实验):PROLOG语言练习与编程上机实验
  4. Oracle 动态性能视图 (x$, v$, gv$, v_$, gv_$)
  5. {Xn}、{Yn}与{XnYn}的敛散性
  6. 小程序开发中使用节流函数throttle的正确方式
  7. 自学者福利!知乎上已获千赞,原理+实战+视频+源码
  8. D:\ANdriod\emulator\qemu\windows-x86_64\qemu-system-i386.exe: Could not open 'C:\Users\榛刓.android\a
  9. 【陈工笔记】# 使用U盘进行WIN10 系统重装 #
  10. 4.关于 “ 写完括号里面代码,如何快速跳出 ”