查看: 2414| 回复: 14
收起左侧

[其他] 求问一道算法题

bbbbbk | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   154
80%
20%
39

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

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

x

有1到n n个数字,最开始它们分布在三个group A,B,C中,给定n和初始A B C 里的数字,解决:
每一步,可以从一个group中选一个数字移动到其他任何一个group中(可以把某个group移空)
要求是最终的三个group,group A 里的最大值小于groupB里的最小值,group B里的最大值小于group C里的最小值
求最少步数
n的范围是10^5


上一篇:Binary Search 试金石
下一篇:为什么 AI (LLM/NLP) 的research工作要考leetcode?
66j 2025-4-20 09:06:17 | 显示全部楼层
本楼:   👍  2
100%
0%
0   👎
全局:   2581
97%
3%
89
本帖最后由 66j 于 2025-4-19 21:34 编辑

三个group 最终肯定是排好序的。
换句话第一个group 如果是 1 2 3 。。。 x, 第二个就是 x + 1, x + 2 ... x + y, 第三个 x + y + 1 ... n

提前算好每个group的数组p, p[i] 代表把 1 到i 这些数放到这个group 需要多少步。

然后枚举第一个group i, 如果我把 1 到i 放进第一个group,那么i + 1 到n 一定要放到2 3 group。放到2 3 的最少步数可以后缀提前处理。

复杂度O(n)
回复

使用道具 举报

本楼:   👍  0
0%
0%
0   👎
全局:   457
96%
4%
19
本帖最后由 vincent_great 于 2025-4-23 05:27 编辑

这道题挖掘一下前缀和的数学公式就行了。。
=======================
首先把0到N-1一共N个数当作index,把group label按照这个index排列起来。。
排好以后可能得到类似“AAABBCCAACCBB”的字符串X。。。
最终需要的字符串肯定是“AAAAABBBBBCCCC”这种的模式
=================================
为了计算最小的步数,需要预先计算三组长度为"N+1"的前缀和"SA/SB/SC"
SA[i]代表X[:i]中group 不为A的个数,SB/SC以此类推
==================================
假设我们目标串里面B与C的开头index分别是 i 与 j
利用前缀和得到需要的操作数量,就是(SA[i]-SA[0])+(SB[j]-SB[i])+(SC[N]-SC[j])。。
里面SA[0] = 0, SC[N]为常数,把上面式子按照 i 与 j 变形,
可以得到(SC[N]-SA[0])+(SA[i]-SB[i])+(SB[j]-SC[j])

这里就非常的清楚了,从后往前预先计算(SB[j]-SC[j])的最大值
然后从前往后枚举 i 计算 (SA[i]-SB[i]),加上对应位置预先计算出来的(SB[j]-SC[j])最大值,就是答案。。。
===========
顺便球一波加米。。。。

补充内容 (2025-04-23 13:34 +08:00):

复习一下前缀和的公式,
对于长度为m的nums得到长度为m+1的前缀和psum
利用前缀和求子数组和,sum(nums[i:j]) = psum[j] - psum[i]

评分

参与人数 3大米 +11 收起 理由
wilsoj + 5 给你点个赞!
nunuh89 + 5 谢谢分享!
bbbbbk + 1 赞一个

查看全部评分

回复

使用道具 举报

66j 2025-4-20 11:12:06 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   2581
97%
3%
89
bbbbbk 发表于 2025-4-19 22:41
请问 “放到2 3 的最少步数可以后缀提前处理” 如何做到O(N), 只想到了N^2的做吗

假设suff[i] 是指吧i 到n放到group 2, 3, suff[i] = min(suff[i + 1] + place i on 2, suff3[i + 1] + min(place i on 2, place i on 3))
suff3[i] 代表 把i 到n 都放到group 3。
suff[i] 代表 把i 到n 都放到group 2 3 并且group2 不为空。
回复

使用道具 举报

 楼主| bbbbbk 2025-4-20 06:07:46 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   154
80%
20%
39
n和数字各不相同
回复

使用道具 举报

 楼主| bbbbbk 2025-4-20 06:08:22 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   154
80%
20%
39
n个数字各不相同
回复

使用道具 举报

_图图 2025-4-20 08:05:36 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   63
97%
3%
2
提示:前缀和
回复

使用道具 举报

 楼主| bbbbbk 2025-4-20 08:32:54 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   154
80%
20%
39
没get到… 大佬能说说解法吗
回复

使用道具 举报

本楼:   👍  0
0%
0%
0   👎
全局:   1194
98%
2%
30
预处理三个前缀和 用于 range sum。
每个前缀和表示将 1-x 都放在该 group 的操作数
枚举两个 pointer 把一到 x 分为三段,每段可以为空
三个 group 从 A 到 C 用三段互不相交的range sum。
但这样是 n^2 的复杂度
用楼上的提前出来可以到达 n
回复

使用道具 举报

 楼主| bbbbbk 2025-4-20 10:41:42 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   154
80%
20%
39
66j 发表于 2025-4-20 01:06
三个group 最终肯定是排好序的。
换句话第一个group 如果是 1 2 3 。。。 x, 第二个就是 x + 1, x + 2 ... ...

请问 “放到2 3 的最少步数可以后缀提前处理” 如何做到O(N), 只想到了N^2的做吗
回复

使用道具 举报

 楼主| bbbbbk 2025-4-20 11:38:03 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   154
80%
20%
39
66j 发表于 2025-04-19 20:12:06
假设suff 是指吧i 到n放到group 2, 3, suff = min(suff + place i on 2, suff3 + min(place i
明白了 谢谢太6了!
回复

使用道具 举报

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

本版积分规则

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