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

[Leetcode] 请教一道数组题,求最优方案或者 leetcode 类似题目

全局:

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

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

x
x = range(1, 2000)
y = [range(125, 200), range(200, 400), range(300, 500)...]
y 里面每个 interval 的取值范围都在 x 中,求 y 中出现次数最多的数。如果答案是多个数,比如 range(200,300), 任何一个都行。


y 的数量非常大,希望找到 time, space 上的最优化算法
不能用两个循环,时间太大不接受。

也不能 flatten y,空间太大不接受。

求指点最优方案 and/or leetcode 上类似题目

评分

参与人数 1大米 +3 收起 理由
14417335 + 3 欢迎来一亩三分地论坛!

查看全部评分


上一篇:LeetCode contest是不是抓作弊抓魔怔了?
下一篇:请问anki软件的复习频率在哪里修改
推荐
刘春涛 2023-5-19 05:14:10 | 只看该作者
全局:
Leetcode #253 很类似 https://leetcode.com/problems/meeting-rooms-ii/
但是,这个是付费会员才能看到的题目

题目是很多的meeting 时间 range,问你最少需要多少个meeting room。 其实就是问重复出现的时间点最多出现了多少次。
而你的题目相当于问重复出现次数最多的时间点,给出一个例子来。略有不同

原题这样可以这样解:

from typing import List
from itertools import accumulate


class Solution:
    def minMeetingRooms(self, intervals: List[List[int]]) -> int:
        arr = [d for _, d in sorted(
            x for s, e in intervals for x in ((s, 1), (e, -1)))]
        return max(accumulate(arr))


solution = Solution()
print(solution.minMeetingRooms([[0, 30], [5, 10], [15, 20]]))  # 2
print(solution.minMeetingRooms([[7, 10], [2, 4]]))  # 1

可以写成一行:
return max(accumulate(d for _, d in sorted(x for s, e in intervals for x in ((s, 1), (e, -1)))))

你需要调整下才能适配到你的问题。只能帮到这了,很多天没刷题了。

评分

参与人数 2大米 +4 收起 理由
14417335 + 3 给你点个赞!
byt2015 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
byt2015 发表于 2023-05-18 14:49:11
没太看懂 arr presum 最大那一步,如果 arr =,怎么找到最大值?
这个算法为什么可行?有什么关键字或者常见题目吗?想搜索学习下。
可以看这个: https://leetcode.com/problems/ma...eep-Line-algorithm/

评分

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

查看全部评分

回复

使用道具 举报

推荐
lby2013 2023-5-19 04:18:37 | 只看该作者
全局:
楼上说的基本是对的,另外如果x范围很大,注意要离散化排序一下端点

评分

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

查看全部评分

回复

使用道具 举报

全局:
扫描线,开一个长度为x的arr,y从左扫到右,每个interval左端点在arr上+1,右端点-1,最后在arr上取最大值

评分

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

查看全部评分

回复

使用道具 举报

🔗
byt2015 2023-5-19 04:04:43 | 只看该作者
全局:
本帖最后由 byt2015 于 2023-5-18 17:36 编辑
Actuant 发表于 2023-5-18 17:22
扫描线,开一个长度为x的arr,y从左扫到右,每个interval左端点在arr上+1,右端点-1,最后在arr上取最大值

只在端点做加减?
arr = [0]* len(x)

for begin, end in interval:
arr[begin]+=1
arr[end]-=1

取 max(arr)?

评分

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

查看全部评分

回复

使用道具 举报

全局:
byt2015 发表于 2023-05-18 13:04:43
只在端点做加减?
arr = * len(x)
最后一步不能直接max,要keep一个presum找最大

举例: x=[0,5), y=[[0,4),[1,4),[2,5)], 那么arr=[1,1,1,0,-2,-1], presum最大值3在[2,4)能取到。加减的地方可能要offset 1取决于开闭区间

评分

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

查看全部评分

回复

使用道具 举报

全局:
变种meeting room。把meeting room的题全做一遍就能手写了

评分

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

查看全部评分

回复

使用道具 举报

🔗
byt2015 2023-5-19 05:49:11 | 只看该作者
全局:
Actuant 发表于 2023-5-18 17:41
最后一步不能直接max,要keep一个presum找最大

举例: x=[0,5), y=[[0,4),[1,4),[2,5)], 那么arr=[1,1,1,0 ...

没太看懂 arr presum 最大那一步,如果 arr =[1,0,1,-1,0,2,0,-2],怎么找到最大值?
这个算法为什么可行?有什么关键字或者常见题目吗?想搜索学习下。

评分

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

查看全部评分

回复

使用道具 举报

全局:
离散化差分

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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