当前位置:首页 > PHP

Php实现最长递增

2026-02-16 14:01:13PHP

PHP实现最长递增子序列

要使用PHP实现最长递增子序列(LIS)算法,可以采用动态规划或二分查找优化的方法。以下是两种实现方式:

动态规划方法

动态规划的时间复杂度为O(n²),适用于较小规模的数据。

function lengthOfLIS($nums) {
    if (empty($nums)) return 0;
    $dp = array_fill(0, count($nums), 1);
    $max = 1;

    for ($i = 1; $i < count($nums); $i++) {
        for ($j = 0; $j < $i; $j++) {
            if ($nums[$i] > $nums[$j]) {
                $dp[$i] = max($dp[$i], $dp[$j] + 1);
            }
        }
        $max = max($max, $dp[$i]);
    }
    return $max;
}

// 示例用法
$nums = [10, 9, 2, 5, 3, 7, 101, 18];
echo lengthOfLIS($nums); // 输出4

二分查找优化方法

二分查找优化的时间复杂度为O(n log n),适用于较大规模的数据。

function lengthOfLIS($nums) {
    $tails = [];
    foreach ($nums as $num) {
        $left = 0;
        $right = count($tails);
        while ($left < $right) {
            $mid = $left + intval(($right - $left) / 2);
            if ($tails[$mid] < $num) {
                $left = $mid + 1;
            } else {
                $right = $mid;
            }
        }
        if ($left == count($tails)) {
            $tails[] = $num;
        } else {
            $tails[$left] = $num;
        }
    }
    return count($tails);
}

// 示例用法
$nums = [10, 9, 2, 5, 3, 7, 101, 18];
echo lengthOfLIS($nums); // 输出4

获取具体子序列

如果需要获取具体的子序列,可以扩展动态规划方法:

Php实现最长递增

function getLIS($nums) {
    if (empty($nums)) return [];
    $dp = array_fill(0, count($nums), 1);
    $prev = array_fill(0, count($nums), -1);
    $maxIndex = 0;

    for ($i = 1; $i < count($nums); $i++) {
        for ($j = 0; $j < $i; $j++) {
            if ($nums[$i] > $nums[$j] && $dp[$i] < $dp[$j] + 1) {
                $dp[$i] = $dp[$j] + 1;
                $prev[$i] = $j;
            }
        }
        if ($dp[$i] > $dp[$maxIndex]) {
            $maxIndex = $i;
        }
    }

    $lis = [];
    while ($maxIndex != -1) {
        array_unshift($lis, $nums[$maxIndex]);
        $maxIndex = $prev[$maxIndex];
    }
    return $lis;
}

// 示例用法
$nums = [10, 9, 2, 5, 3, 7, 101, 18];
print_r(getLIS($nums)); // 输出[2, 3, 7, 101]

注意事项

动态规划方法易于理解但效率较低,适合小规模数据。二分查找优化方法效率更高,适合大规模数据。获取具体子序列时,需要额外维护一个数组记录前驱节点。

标签: 最长Php
分享给朋友:

相关文章

Php实现imagehash

Php实现imagehash

PHP 实现 ImageHash ImageHash 是一种图像指纹算法,用于快速比较图像的相似性。PHP 可以通过 GD 库或 Imagick 扩展实现该功能。以下是两种实现方式: 使用 GD 库…

实现一个计算器Php

实现一个计算器Php

基本计算器实现 创建一个简单的PHP计算器需要处理用户输入并执行基本的数学运算。以下是一个完整的示例代码: <?php $result = ""; if ($_SERVER["REQUEST_…

Php实现百万请求

Php实现百万请求

PHP 实现百万请求的优化策略 高并发场景下处理百万级请求需要从架构设计、代码优化、服务器配置等多方面入手。以下是关键优化方向: 代码层面优化 使用PHP-FPM配合Nginx/Apache时,调整…

Php实现imagehash

Php实现imagehash

PHP 实现 ImageHash ImageHash 是一种用于图像相似度比较的技术,通过计算图像的哈希值来判断图像是否相似。以下是使用 PHP 实现 ImageHash 的方法。 安装依赖库 确保…

Php手工实现

Php手工实现

PHP 手工实现 PHP 手工实现通常指的是不依赖框架或库,直接使用原生 PHP 代码完成特定功能。以下是几个常见场景的手工实现方法: 数据库连接与操作 使用 PHP 原生函数连接 MySQL 数据…

实现一个计算器Php

实现一个计算器Php

基础PHP计算器实现 创建一个简单的PHP计算器可以通过HTML表单接收用户输入,PHP处理计算逻辑。以下是基础实现方式: HTML表单部分 <form method="post" acti…