私は、以下にCodilityの問題で働いていました
N個の整数からなる非空の配列Aが与えられます。
ピークは、その隣接より大きい配列要素です。より正確には、it is an index P such that 0 < P < N − 1 and A[P − 1] < A[P] > A[P + 1]
。
For example, the following array 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:正確に4つのピークを有しています。
以下の図に示すように、相対的な高さの配列Aで表され、山の範囲に旅行に行くされています。あなたはあなたと一緒に取る必要がありますどのように多くのフラグを選択する必要があります。目標は、一定のルールによれば、ピーク上のフラグの最大数を設定することです。
旗はピークのみに設定することができます。| - Q P |あなたはKフラグを取る場合、多くはである何、その後、任意の二つのフラグの間の距離がより大きくなるか、Kに等しくなければならない指標PとQの間の距離は、絶対値です。
あなたが取る場合、例えば、所定の山脈は、N = 12で、上記アレイAによって表されます:
二つのフラグは、ピーク1および5にそれらを設定することができます。3つのフラグは、あなたがピーク1、5および10にそれらを設定することができます。4つのフラグは、あなただけの3つのフラグを設定することができ、ピーク1、5、10あなたができる上、そのため、この場合には3つのフラグの最大値を設定します。
機能を書きます:
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 is an integer within the range [1..400,000];
each element of array A is an integer within the range [0..1,000,000,000].
Complexity:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N) (not counting the storage required for input arguments).
私は、以下にソリューションを歩きます
public static int solution(int[] A) {
int N = A.length;
/*
* P = [1, 1, 3, 3, 5, 5, 10, 10, 10, 10, 10, -1]
* */
int[] P = nextPeak(A);
int i = 1;
int result = 0;
while ((i - 1) * i <= N) {
int index = 0;
int flags = 0;
while (index < N && flags < i) {
/*
* P = [1, 1, 3, 3, 5, 5, 10, 10, 10, 10, 10, -1]
* */
index = P[index];
if (index == -1) {
break;
}
flags += 1;
index += i;
}
/*
* maximize the number of flags for the whole segment
* */
result = Math.max(result, flags);
i++;
}
return result;
}
/*
* A = [1, 1, 3, 3, 5, 5, 10, 10, 10, 10, 10, -1]
* */
public static int[] nextPeak(int[] P) {
int N = P.length;
ArrayList<Integer> peaks = new ArrayList<Integer>();
for (int i = 1; i < P.length - 1; i++) {
if (P[i] > P[i - 1] && P[i] > P[i + 1]) {
peaks.add(i);
}
}
int[] A = new int[N];
A[N - 1] = -1;
for (int i = N - 2; i >= 0; i--) {
if (peaks.contains(i)) {
A[i] = i;
} else {
A[i] = A[i + 1];
}
}
return A;
}
一般的に、私は計算を理解するが、我々は条件を満たしていない場所を確認するために失敗しますif you take K flags, then the distance between any two flags should be greater than or equal to K
。
私は、これは内部にある想像while
の条件(i-1)*i <= N
が、それを適切に理解することができませんでし。誰もが親切に私にそれを説明するだろうか?
あなたの答えをされindex += i;
た状態と組み合わせflags < i
でwhile
ループ。ほとんどのKフラグで挿入し、一度に歩行Kの手順:彼らは逆でソリューションを働きます。