编辑
刚刚指出需求状态峰值不能是数组的末端。
所以我跑过这个网站
如果您能在 2 小时内解决这些问题,这会给您带来编程问题并为您提供证书。第一个问题是我以前见过的,通常称为峰与旗问题。如果你不熟悉
给出了一个由 N 个整数组成的非空零索引数组 A。一个峰值是一个数组元素,它比它的邻居大。更准确地说,它是一个索引 P 使得
0 < P < N - 1 和 A[P - 1] < A[P] > A[P + 1]
. 例如下面的数组 A:
A[0] = 1
A[1] = 5
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2
恰好有四个峰:元素 1、3、5 和 10。
您将前往一系列山脉,其相对高度由数组 A 表示。您必须选择随身携带的旗帜数量。目标是根据某些规则在峰上设置最大数量的标志。
标志只能设置在峰上。更重要的是,如果你取K个标志,那么任何两个标志之间的距离应该大于或等于K。索引P和Q之间的距离是绝对值|P-Q|。
例如,给定上面数组 A 表示的山脉,N = 12,如果你取:
两个标志,您可以将它们设置在峰 1 和 5 上;
三个标志,您可以将它们设置在峰 1、5 和 10 上;
四个标志,您只能在峰 1、5 和 10 上设置三个标志。
因此,在这种情况下,您最多可以设置三个标志。
编写一个函数,给定一个由 N 个整数组成的非空零索引数组 A,返回可以在数组峰值上设置的最大标志数。例如,给定上面的数组
如上所述,该函数应返回 3。
假使,假设:
N 是 [1..100,000] 范围内的整数;
数组 A 的每个元素都是 [0..1,000,000,000] 范围内的整数。
复杂:
预期的最坏情况时间复杂度为 O(N);预期的最坏情况空间复杂度为 O(N),超出输入存储(不计算输入参数所需的存储)。
可以修改输入数组的元素。
所以这是有道理的,但我使用这段代码失败了
public int GetFlags(int[] A)
{
List<int> peakList = new List<int>();
for (int i = 0; i <= A.Length - 1; i++)
{
if ((A[i] > A[i + 1] && A[i] > A[i - 1]))
{
peakList.Add(i);
}
}
List<int> flagList = new List<int>();
int distance = peakList.Count;
flagList.Add(peakList[0]);
for (int i = 1, j = 0, max = peakList.Count; i < max; i++)
{
if (Math.Abs(Convert.ToDecimal(peakList[j]) - Convert.ToDecimal(peakList[i])) >= distance)
{
flagList.Add(peakList[i]);
j = i;
}
}
return flagList.Count;
}
编辑
int[] A = new int[] { 7, 10, 4, 5, 7, 4, 6, 1, 4, 3, 3, 7 };
正确答案是 3,但我的应用程序说 2
这我不明白,因为有 4 个峰值(索引 1、4、6、8),因此,您应该能够在其中 2 个峰值(1 和 6)处放置一个标志
我在这里错过了什么吗?显然我的假设是 Array 的开头或结尾可以是一个峰值,不是这样吗?
如果这需要进入 Stack Exchange Programmers,我会移动它,但认为此处的对话框会有所帮助。
编辑