A non-empty array A consisting of N integers is given.
A peak is an array element which is larger than its neighbours. More precisely, 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] = 2has exactly four peaks: elements 1, 3, 5 and 10.
You are going on a trip to a range of mountains whose relative heights are represented by array A, as shown in a figure below. You have to choose how many flags you should take with you. The goal is to set the maximum number of flags on the peaks, according to certain rules.

Flags can only be set on peaks. What's more, if you take K flags, then the distance between any two flags should be greater than or equal to K. The distance between indices P and Q is the absolute value |P − Q|.
For example, given the mountain range represented by array A, above, with N = 12, if you take:
- 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.
You can therefore set a maximum of three flags in this case.
Write a function:
class Solution { public int solution(int[] A); }
that, given a non-empty array A of N integers, returns the maximum number of flags that can be set on the peaks of the array.
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] = 2the function should return 3, as explained above.
Write an efficient algorithm for the following assumptions:
- 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].
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1]
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length);
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
[1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1]
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length) + 1;
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
[1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1]
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length) + 1;
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length) + 1;
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
[1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1]
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。 <- 誤り。実際には端っこの
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length) + 1;
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。 <- 誤り。実際には端っこの分は正確K開けなくてもよいので、squrt(N) + 1が最大
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length) + 1;
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
[1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1]
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
// peekに旗を立てていく
// 最大何本の旗が立てられるのかを返却する。
// ■ ルール
// - K本の旗を持っていった場合には、Kの距離開けないと次の旗を立ててはいけない。
//
// ■ 定義
// - peekとは、左右よりも高いところ。<- 最大 N / 2 peek 以上のpeekが存在することはない。
// - k本の旗を持っていった場合に、kのdistance以上開けないと旗は建てられない。
// - 建てられる旗の最大 k*k = N にもっとも近い数。 <- 誤り。実際には端っこの分は正確K開けなくてもよいので、squrt(N) + 1が最大
// ■処理順序
// - peekを始めに算出する。
// - i*i = Nに最も近いKで何本建てられるかy本をだす。
// - i--; して 最大のy本と同じ値になるまで繰り返す。
//
// - 終了して良い条件
// - i <= y
// - y = peekの数になった場合。
public int solution(int[] A) {
int maxFlagCounter = 0;
int peekCounter = 0;
boolean[] peeks = new boolean[A.length];
// peekの算出
for (int i=1; i<A.length-1; i++) {
if (A[i-1] < A[i] && A[i+1] < A[i]) {
peeks[i] = true;
peekCounter++;
}
}
int k = (int)Math.sqrt(A.length) + 1;
while (k > maxFlagCounter) {
int prePosition = -400000;
int tempFlgCounter = 0;
for (int i=0; i<A.length; i++) {
if (peeks[i]) { // 頂上だった場合。
// 旗をおけるか判定
if ((i - prePosition) >= k) {
prePosition = i;
tempFlgCounter++;
if (tempFlgCounter == k || tempFlgCounter == peekCounter) {
break;
}
}
}
}
maxFlagCounter = Math.max(maxFlagCounter, tempFlgCounter);
tempFlgCounter = 0;
prePosition = 0;
if (maxFlagCounter == peekCounter) {
break;
}
k--;
}
return maxFlagCounter;
}
}
The following issues have been detected: timeout errors.
extreme test, maximal number of elements
running time: 4.396 sec., time limit: 4.352 sec.