微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

棘手的数据结构和算法问题

如何解决棘手的数据结构和算法问题

我在比赛中被这个问题困了 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

到目前为止我尝试过的

  1. 我试图用 O(N2) 中的两个循环天真地解决这个问题 时间复杂度但没能把它变成 O(N log N)

  2. 我尝试进行分而治之,但无法获得合并步骤

  3. 如果数组是一座山,那么找到答案很容易。只需迭代 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] 结束的子数组。

  4. 我试图打破山脉列表中的数组并解决山脉,但无法执行合并步骤,即;当A[l]和A[r]属于不同的山时。

  5. 我尝试使用 2 个指针来完成,因为使用 2 个指针方法成功解决了那场比赛中的所有问题。还有比赛的名字是2个指针。

我希望这些信息足够了。对于任何其他信息或查询,请在评论中提及我

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?