如何解决棘手的数据结构和算法问题
我在比赛中被这个问题困了 2 天多
注意:比赛已经结束。 这是本次比赛的问题 4(CodeDrift: 2 Pointers)
问题说明
给定一个大小为 N 的数组。
子数组 A[l..r] 包含从 A[l] 到 A[r] 的所有元素。子数组是缩放子数组
如果 A[l] + A[r] ≡ max(A[l..r]) mod (B)
其中 B 是一个整数,max() 函数是子数组中的最大数
找出缩放器子数组的总数。由于答案可能很大,返回模 109 + 7
问题约束
1 5
1 9
示例输入
A : [8,7]
乙:4
A : [4,5,3,8,8]
乙:5
A : [1,10,2,6,4]
乙:3
对应输出
1
3
11
到目前为止我尝试过的
-
我试图用 O(N2) 中的两个循环天真地解决这个问题 时间复杂度但没能把它变成 O(N log N)
-
我尝试进行分而治之,但无法获得合并步骤
-
如果数组是一座山,那么找到答案很容易。只需迭代 A[r]。直到山峰,由于max在这个区域与A[r]相同,所以在A[0..r]中找到A[l]≡0 mod(B)。
现在对于下坡,可以将问题分为两部分。 A[0..peak] 和部分 A(peak..ar].
对于部分 A[0..peak] max 保持不变,我们可以在 A[0..peak]
中寻找 (mx - A[r]) mod B 对于 A(peak,A[r]) 部分,如果我们将任何元素视为 A[l],则 max 与 A[l] 相同。这意味着如果 A[r] ≡ 0 mod(B),则 A[l..r] 是缩放子数组。所以 A(peak,A[r]] 中的所有元素将形成一个从自身开始到 A[r] 结束的子数组。 -
我试图打破山脉列表中的数组并解决山脉,但无法执行合并步骤,即;当A[l]和A[r]属于不同的山时。
我希望这些信息足够了。对于任何其他信息或查询,请在评论中提及我
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。