查看: 2085| 回复: 15
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 自己想了一道连续数组变形题 解不出来 求分享下思路

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
最近刷了好多子数组/子序列, 包含负数不包含负数,子数组和等于/小于target的题
然后我结合了一下各类型的题给自己出了一道变形题 然而并没有好的思路
求大家帮我看一下  有见识的大佬如果发现它是LeetCode原题的话希望可以告诉我

题如下:

给定一个数组nums,里面包含正数和负数, 给定一个目标值V, 求子数组和不大于V的最长子数组长度

例 nums = [1,3,-5,6,0,2,-4,6]  V=6

ans = 7

最长子数组为[1,3,-5,6,0,2,-4]
1+3-5+6+0+2-4 = 3

我挠破头也只能想出O(n^2)的解
但是感觉计算好像是有冗余的 不知道该怎么优化 希望大家提供一下思路 (如果能给个pseudocode就更好了)

感激不尽!

评分

参与人数 1大米 +10 收起 理由
14417335 + 10

查看全部评分


上一篇:Java 什么时候需要class名跟文件名一样呢
下一篇:有没有Noogler已经入职的可以一起学习的!!求队友
推荐
PandaLeaves 2021-2-25 06:30:59 | 只看该作者
全局:
pandami 发表于 2021-2-25 06:24
递增数组是按照presum排序吗?
如果这样,第一个大于的不一定是序号最小的
因为有负数

类似于单调队列,你要扔掉一些对答案没有贡献的elements
用楼主的例子:
[1,3,-5,6,0,2,-4,6]
前缀和是
[1,4,-1,5,5,7,3,9]
那么我们单调数组里面存
{(1,1),(4,2),(5,4),(7,6),(9,8)} pair第一数据是值,第二个数据是位置
然后用这个数组的第一数据来二分

评分

参与人数 2大米 +2 收起 理由
不知道小帅 + 1 赞一个
猫与影子 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

推荐
PandaLeaves 2021-2-25 05:55:18 | 只看该作者
全局:
本帖最后由 PandaLeaves 于 2021-2-25 06:11 编辑

先前缀和。我们用s_i 来表示a_1+a_2...+a_i 的和。然后扫一遍数组,对于每个s_i,我们像找到最小的j, 使得s_i-s_j<=V.
所问题变成了动态询问数组里面第一个大于k的位置,where k=s_i-V.
这个问题可以:

1.直接用线段树来做,每个线段维护区间最大值,然后动态插入。O(n log n)
2. 或者我们可以维护一个单调数组,然后二分来做。O(n log n).



评分

参与人数 2大米 +2 收起 理由
不知道小帅 + 1 赞一个
猫与影子 + 1 太牛了 谢谢大神!

查看全部评分

回复

使用道具 举报

全局:
所以V可以是负数

补充内容 (2021-2-25 04:12):
也许用segment tree可以nlogn
因为你需要知道某个index之前某个数据区间对应的最小坐标

评分

参与人数 2大米 +2 收起 理由
猫与影子 + 1 给你点个赞!
不知道小帅 + 1 赞一个

查看全部评分

回复

使用道具 举报

全局:
前缀和+递增stack 行不行?只是空想了一下,没推演

补充内容 (2021-2-25 04:27):
感觉不太行

评分

参与人数 1大米 +1 收起 理由
猫与影子 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
先做一个sum array,记录从第一个加到最后一个的sum,然后用两个pointer,left, right,结合之前的sum array来检查当前sub array(left right)是否符合,如果符合直接输出当前长度,如果不是,比较原始数列left 和right 大小,谁大就去掉谁

补充内容 (2021-2-25 05:40):
有bug,不是正解

补充内容 (2021-2-25 05:44):
试试map和heap,参考leetcode 862

评分

参与人数 1大米 +1 收起 理由
猫与影子 + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

全局:
PandaLeaves 发表于 2021-02-24 13:55:18
先前缀和,然后问题变成动态询问数组里面第一个小于k的位置。
我们可以维护一个单调数组,然后二分来做。
O(n log n).
如何二分?
单调数组按照什么排序?
回复

使用道具 举报

🔗
PandaLeaves 2021-2-25 06:06:44 | 只看该作者
全局:
pandami 发表于 2021-2-25 05:58
如何二分?
单调数组按照什么排序?

我们注意到在前缀和数组中,如果s_a<s_b且a>b,那么s[a]对于答案没有贡献。
所以我们维护一个严格递增的数组
对于每个i, 我们在那个数组里面找到第一个大于s_i-V的数,得到当前以i结尾的最大长度。

评分

参与人数 2大米 +4 收起 理由
不知道小帅 + 3 太有才了!
猫与影子 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
匿名的 2021-2-25 06:11:03 | 只看该作者
全局:
PandaLeaves 发表于 2021-2-25 05:55
先前缀和。我们用s_i 来表示a_1+a_2...+a_i 的和。然后扫一遍数组,对于每个s,我们像找到最小的j, 使得s_i- ...

666666666
回复

使用道具 举报

🔗
匿名的 2021-2-25 06:12:40 | 只看该作者
全局:
pandami 发表于 2021-2-25 05:58
如何二分?
单调数组按照什么排序?

二分找能满题目要求加和的条件的最小的index, 这样长度最长

评分

参与人数 1大米 +1 收起 理由
猫与影子 + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

全局:
PandaLeaves 发表于 2021-02-24 14:06:44
我们注意到在前缀和数组中,如果s_a<s_b且a>b,那么s对于答案没有贡献。
所以我们维护一个严格递增的数组
对于每个i, 我们在那个数组里面找到第一个大于s_i-V的数,得到当前以i结尾的最大
递增数组是按照presum排序吗?
如果这样,第一个大于的不一定是序号最小的
因为有负数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表