PHP самая длинная возрастающая подпоследовательность
Так что здесь есть ответы, которые применимы к C, но я пытаюсь сделать это на PHP, И определенным образом.
У меня есть массив чисел, как это:
7, 2, 6, 3, 10
Я хочу найти самую длинную возрастающую подпоследовательность, которая происходит ПЕРВЫЙ в указанном порядке. Так, например, в этом случае я хочу, чтобы результат был:
2, 6, 10
И НЕ 2, 3, 10.
Каков наилучший способ сделать это?
3 ответа
Вот мое собственное решение самой длинной задачи кодирования возрастающей подпоследовательности, оно прошло все 10 тестовых случаев.
<?php
function ArrayChallenge($arr) {
$newArr = [];
foreach ($arr as $key => $value) {
$temp = array_slice($arr, $key, count($arr)-$key);
//print_r($temp);
$newArr[$key][] = "";
for($i=0; $i<count($temp); $i++) {
if ($temp[$i] > $value && max($newArr[$key]) < $temp[$i]){
$newArr[$key][] = $temp[$i];
}
}
}
//print_r($newArr);
$result = 0;
foreach ($newArr as $item) {
if (count($item) > $result) $result = count($item);
}
return $result;
}
Хорошо, вот решение вашего вопроса, дающее ожидаемый ответ. По сути, для каждого найденного элемента начинайте список и добавляйте в него элементы, если они больше, чем последний элемент в списке.
$input = array(7,2,6,3,10);
$trial = array();
echo "Input: ";
print_r($input);
echo "<br><br>\n";
foreach ($input as $key => $value)
{
// Create a new trial for each starting point
// ------------------------------------------
$trial[$key][0] = $value;
echo "Trial $key started<br>\n";
// Process all prior trials
// ------------------------
for ($i = $key-1; $i >= 0; $i--)
{
echo "Looking at trial $i ";
$last = count($trial[$i]) - 1;
$lastval = $trial[$i][$last];
if ( $value > $lastval )
{
$trial[$i][] = $value;
echo "** added $value";
}
echo "<br>\n";
}
echo "<br>\n";
}
// Find first longest trial
// ------------------------
$longest = 0;
foreach ($trial as $key => $list)
{
if ( count($list) > count($trial[$longest]) )
$longest = $key;
}
echo "All trials:<br>\n";
print_r($trial);
echo "<br><br>\n";
echo "First longest sequence:<br>\n";
print_r($trial[$longest]);
Конечно, есть вещи, которые можно сделать по-другому, если у вас есть очень большие наборы данных. Тем не менее, вот некоторые "отладочные" выходные данные, показывающие его в действии:
Input: Array ( [0] => 7 [1] => 2 [2] => 6 [3] => 3 [4] => 10 ) Trial 0 started Trial 1 started ... looking at trial 0 Trial 2 started ... looking at trial 1 ** added 6 ... looking at trial 0 Trial 3 started ... looking at trial 2 ... looking at trial 1 ... looking at trial 0 Trial 4 started ... looking at trial 3 ** added 10 ... looking at trial 2 ** added 10 ... looking at trial 1 ** added 10 ... looking at trial 0 ** added 10 All trials: Array ( [0] => Array ( [0] => 7 [1] => 10 ) [1] => Array ( [0] => 2 [1] => 6 [2] => 10 ) [2] => Array ( [0] => 6 [1] => 10 ) [3] => Array ( [0] => 3 [1] => 10 ) [4] => Array ( [0] => 10 ) ) First longest sequence: Array ( [0] => 2 [1] => 6 [2] => 10 )
Попробуйте этот код
<?php
$data = array(7, 2, 6, 3, 10);
$slice_array=array_slice($data,array_search(min($data),$data));
$result=array();
for($i=array_search(min($slice_array),$slice_array);$i<=array_search(max($slice_array),$slice_array);$i++){
if(end($result)<$slice_array[$i]){
array_push($result,$slice_array[$i]);
}
}
print_r($result);
?>
ВЫХОД
Array ( [0] => 2 [1] => 6 [2] => 10 )