Bash Flags
flags() {
local -n _a="$1"
local _size=${#_a[@]}
local -a _peak _nxt
_peak[0]=0
local _i
for ((_i = 1; _i < _size; _i++)); do
local _right=0
(( _i + 1 < _size )) && _right=${_a[_i+1]}
if (( _a[_i-1] < _a[_i] && _a[_i] > _right )); then _peak[_i]=1; else _peak[_i]=0; fi
done
_nxt[_size-1]=-1
for ((_i = _size - 2; _i >= 0; _i--)); do
if (( _peak[_i] )); then _nxt[_i]=$_i; else _nxt[_i]=${_nxt[_i+1]}; fi
done
_i=1
local _result=0
while (( _i * (_i - 1) <= _size )); do
local _pos=0 _num=0
while (( _pos < _size && _num < _i )); do
_pos=${_nxt[_pos]}
if (( _pos == -1 )); then break; fi
((_num++))
_pos=$(( _pos + _i ))
done
((_i++))
(( _num > _result )) && _result=$_num
done
echo "$_result"
}
This finds all peaks first, then checks how many flags can be placed while keeping the required distance.