我正在尝试解决最新的 codility.com 问题(只是为了提高我的技能)。我尝试了分配但没有得到超过 30 分,所以现在很好奇我的解决方案中到底缺少什么。
问题说
给出了一个由 N 个整数组成的非空零索引数组 A。一个峰值是一个数组元素,它比它的邻居大。更准确地说,它是一个索引 P 使得
0 < P < N − 1 and 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,如果你取:
> two flags, you can set them on peaks 1 and 5;
> three flags, you can set them on peaks 1, 5 and 10;
> four flags, you can set only three flags, on peaks 1, 5 and 10.
因此,在这种情况下,您最多可以设置三个标志。
编写一个函数,给定一个由 N 个整数组成的非空零索引数组 A,返回可以在数组峰值上设置的最大标志数。例如,给定上面的数组
如上所述,该函数应返回 3。
假使,假设:
N 是 [1..100,000] 范围内的整数;
数组 A 的每个元素都是 [0..1,000,000,000] 范围内的整数。
复杂:
预期的最坏情况时间复杂度为 O(N);预期的最坏情况空间复杂度为 O(N),超出输入存储(不计算输入参数所需的存储)。
所以我根据我对问题的理解尝试了这段代码
var A = [1,5,3,4,3,4,1,2,3,4,6,2];
function solution(A) {
array = new Array();
for (i = 1; i < A.length - 1; i++) {
if (A[i - 1] < A[i] && A[i + 1] < A[i]) {
array.push(i);
}
}
//console.log(A);
//console.log(array);
var position = array[0];
var counter = 1;
var len = array.length;
for (var i = 0; i < len; i++) {
if (Math.abs(array[i+1] - position) >= len) {
position = array[i+1];
counter ++;
}
}
console.log("total:",counter);
return counter;
}
上面的代码适用于示例数组元素:[1,5,3,4,3,4,1,2,3,4,6,2]
Get peaks at indices: [1, 3, 5, 10]
and set flags at1, 5, and 10 (total 3)
但是 codility.com 说它在数组上失败[7, 10, 4, 5, 7, 4, 6, 1, 4, 3, 3, 7]
我的代码在索引处达到峰值:[1, 4, 6, 8]
并在 1 和 6 处设置标志(总共 2 个),但 coditity.com 说它应该是 3 个标志。(不知道为什么)我是否误解了这个问题?
请我只是在寻找提示/算法。我知道有人已经问过这个问题并在私人聊天室中解决了,但在那个页面上,我试图向那个人寻求帮助,但成员们宁愿将我的帖子标记为不恰当的答案,所以我再次在这里问这个问题。
PS:您可以在这里尝试自己编写挑战!