有一口老干井。它的侧面由混凝土环制成。每个这样的环都有一米高,但这些环可以有不同的(内)直径。然而,所有的环都以彼此为中心。井深N米;也就是说,里面有N个混凝土环。您即将将 M 个混凝土圆盘放入井中。每个圆盘厚一米,不同的圆盘可以有不同的直径。一旦每个磁盘掉落,它就会掉落,直到:
- 它撞到井底;
- 它撞击一个内径小于圆盘直径的环;或者
- 它击中了先前掉落的磁盘。(请注意,如果环的内径和圆盘的直径相等,则圆盘可以穿过环。)
您将要掉落的圆盘已准备好,您知道它们的直径,以及井中所有圆环的直径。问题出现了:有多少磁盘可以放入井中?
写一个函数:int fall_disks(int A[], int N, int B[], int M); 即,给定两个零索引的整数数组 - A,包含 N 个环的内径(按自上而下的顺序),B,包含 M 个圆盘的直径(按它们被丢弃的顺序) -返回将适合井的磁盘数。例如,给定以下两个数组:
A[0] = 5 B[0] = 2
A[1] = 6 B[1] = 3
A[2] = 4 B[2] = 5
A[3] = 3 B[3] = 2
A[4] = 6 B[4] = 4
A[5] = 2
A[6] = 3
该函数应该返回 4,因为除了最后一个磁盘之外的所有磁盘都可以放入井中。该图显示了丢弃四个磁盘后的情况。
假使,假设:
- N 是 [1..200,000] 范围内的整数;
- M 是 [1..200,000] 范围内的整数;
- 数组 A 的每个元素都是 [1..1,000,000,000] 范围内的整数;
- 数组 B 的每个元素都是 [1..1,000,000,000] 范围内的整数。
复杂:
- 预期的最坏情况时间复杂度为 O(N);
- 预期的最坏情况空间复杂度为 O(N),超出输入存储(不计算输入参数所需的存储)。
- 可以修改输入数组的元素。
我尝试使用堆栈并做某事,但我无法获得 O(n) 解决方案,即使经过我认为的一些优化,最坏的情况仍然是 O(n^2)。