【发布时间】:2013-10-27 18:45:45
【问题描述】:
编辑
刚刚指出需求状态的峰值不能是数组的结尾。
于是我跑到了这个网站
如果你能在 2 小时内解决它们,这会给你带来编程问题并给你证书。第一个问题是我以前见过的,通常称为峰与旗问题。如果你不熟悉
给出了一个由 N 个整数组成的非空零索引数组 A。一个峰值是一个数组元素,它比它的邻居大。更准确地说,它是一个索引 P 使得
0 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个flag,那么任何两个flag之间的距离应该大于或等于K。索引P和Q之间的距离是绝对值|P-Q|。
例如,给定上面数组 A 表示的山脉,N = 12,如果取:
两个flag,可以分别设置在峰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,我会移动它,但认为此处的对话框会有所帮助。
编辑
【问题讨论】:
-
您可以在 1、4、8 上设置 3 个标志
-
所以你有能力“跳过”一个高峰?我不确定您将如何在数组中向前看 N 长度数组,而不会非常低效。有什么想法吗?
-
我没有看到任何您不能跳过高峰的信息 - 即使您的答案 1 和 6 也跳过了高峰。您能否发布一些指向此代码挑战的链接?
-
我认为最好的策略是:当你可以设置一个标志时——就设置它。因此,如果距离允许您设置标志 - 设置它。
-
你可能是对的,我只是很难把我的大脑包裹在这个问题上。当标志不等于或大于您可以拥有的最大标志时,您如何在 1 和 4 处设置标志?最大标志为 4,1 和 4 之间的差值小于此值。