我知道这个问题已经问过几次了,但是我在寻找解释而不是解决方案。
任务如下:
给出了一个由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上设置三个标志。 因此,在这种情况下,您最多可以设置三个标志。
编写函数:
class Solution {
public int solution(int[] A);
}
给定一个N个整数的非空数组A,它返回可以在该数组的峰上设置的最大标志数。
例如,以下数组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
该函数应返回3,如上所述。
为以下假设写出有效的算法:
N是[1..400,000]范围内的整数; 数组A的每个元素都是[0..1,000,000,000]范围内的整数。
到目前为止,我的代码:
class Solution {
public int solution(int[] A) {
// write your code in Java SE 8
List <Integer> index= new ArrayList <Integer> ();
int N=A.length;
boolean block=false;
int divisor=0;
int flags=0;
int counter=0;
for(int i=1;i<A.length-1;i++){
if(A[i]>A[i+1] && A[i]>A[i-1]){
index.add(i);
}
}
for(int k=N;k>=1;k--){
if(N%k==0) {
divisor=k;
block=true;
}
我认为遍历列表中的每个索引将是更快的方法,而除数是最好的方法,因为此任务属于质数/复数课程。我只是不知道该怎么做,所以任何有外行术语解释的想法都将真正有帮助。谢谢