2 回答

TA貢獻1811條經驗 獲得超6個贊
您可以采用迭代方法,并將其視為處理每個級別的值,每個下一個級別的總值都會減少 1 個值。換句話說,您可以將其視為逐級進行的廣度優先搜索。因此,您可以使用一種queue
?數據結構一次處理每個級別。
您可以使用 PHP 的SplQueue
類來實現這一點。請注意,我們可以利用此類,因為它在double-ended queue
以下 4 個操作的幫助下充當 a:
enqueue
- 將值排入隊列末尾。dequeue
- 將值從隊列頂部出列。push
- 將值推送到雙向鏈表的末尾(這里,隊列是作為雙向鏈表實現的)。pop
- 從雙向鏈表的末尾彈出一個節點。
毫無疑問,以上 4 個操作都可以在 O(1) 時間內完成。
算法:
將所有數組元素添加到隊列中。
我們將循環直到隊列大小大于 1。
現在,如果隊列級別大小為奇數,
pop
則使用最后一個并將其保存在緩沖區中(在變量中)。dequeue
通過一次 ing 2來添加所有成對元素,然后enqueue
將它們添加到下一個級別。級別迭代后,如果前一個級別大小為奇數,則添加最后一個元素。
打印這些添加的元素并相應地為每個級別回顯新行。
片段:
<?php
function sumForTwos($arr){
? ? if(count($arr) == 1){
? ? ? ? echo $arr[0];
? ? ? ? return;
? ? }
? ??
? ? $queue = new SplQueue();
? ??
? ? foreach($arr as $val){
? ? ? ? $queue->enqueue($val); // add elements to queue
? ? }
? ??
? ? while($queue->count() > 1){
? ? ? ? $size = $queue->count();
? ? ? ? $last = false;
? ? ? ? if($size % 2 == 1){
? ? ? ? ? ? $last = $queue->pop(); // pop the last odd element from the queue to make queue size even
? ? ? ? ? ? $size--;
? ? ? ? }
? ? ? ??
? ? ? ? for($i = 0; $i < $size; $i += 2){
? ? ? ? ? ? $first? = $queue->dequeue();
? ? ? ? ? ? $second = $queue->dequeue();
? ? ? ? ? ? echo $first + $second," ";
? ? ? ? ? ? $queue->enqueue($first + $second);
? ? ? ? }
? ??
? ? ? ? if($last !== false){// again add the last odd one out element if it exists
? ? ? ? ? ? echo $last; // echo it too
? ? ? ? ? ? $queue->push($last);?
? ? ? ? }
? ? ? ??
? ? ? ? echo PHP_EOL;// new line
? ? }
? ??
}
sumForTwos([1, 2, 3, 4, 5, 6, 8, 9, 9]);

TA貢獻1784條經驗 獲得超8個贊
這是你想要的嗎?
function pairBySums($inputArray)
{
if (sizeof($inputArray) % 2 == 1) {
$lastEntry = array_pop($inputArray); //$inputArray now has even number of elements
}
$answer = [];
for ($ii = 0; $ii < sizeof($inputArray) / 2; $ii++) {
$firstIndexOfPair = $ii * 2; // 0 maps to 0, 1 maps to 2, 3 maps to 4 etc
$secondIndexOfPair = $firstIndexOfPair + 1; // 0 maps to 1, 1 maps to 3, 2 maps to 5 etc
$answer[$ii] = $inputArray[$firstIndexOfPair] + $inputArray[$secondIndexOfPair];
}
if (isset($lastEntry)) {
array_push($answer, $lastEntry);
}
echo implode(' ', $answer) . "<br>";
if (sizeof($answer) > 1) {
pairBySums($answer);
}
}
該算法確保它在偶數數組上運行,然后將奇數條目附加回數組(如果有)。
$input = [1, 2, 3, 4, 5, 6, 8, 9, 9];
pairBySums($input);
產生:
3 7 11 17 9
10 28 9
38 9
47
對于偶數個項目,
$input = [1, 2, 3, 4, 5, 6, 8, 9];
pairBySums($input);
產生:
3 7 11 17
10 28
38
- 2 回答
- 0 關注
- 175 瀏覽
添加回答
舉報