当前位置:首页 > PHP

Php实现最长递增

2026-02-16 14:01:13PHP

PHP实现最长递增子序列

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

Php实现最长递增

动态规划方法

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

Php实现最长递增

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

获取具体子序列

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

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手工实现

Php手工实现

PHP手工实现通常指不依赖框架或现成工具,通过原生PHP代码完成特定功能开发。以下是常见场景的实现方法: 数据库连接与操作 使用mysqli或PDO建立数据库连接: $conn = new mys…

实现一个计算器Php

实现一个计算器Php

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

Php实现imagehash

Php实现imagehash

实现图片哈希(ImageHash)的 PHP 方法 图片哈希(ImageHash)是一种用于快速比较图片相似度的技术,通常用于去重或相似图片搜索。以下是基于 PHP 实现图片哈希的几种方法: 平…

Php手工实现

Php手工实现

PHP 手工实现基础框架 手工实现一个 PHP 框架需要理解核心组件,如路由、请求处理、视图渲染和数据库交互。以下是一个极简框架的实现思路: 路由系统 $requestUri = $_SERVER…

Php redis实现报名

Php redis实现报名

使用PHP和Redis实现报名功能 Redis作为高性能的键值存储系统,适合处理高并发的报名场景。以下是实现方案: 数据准备 在Redis中创建报名相关的数据结构: 活动信息哈希表:存储活…

Php实现投票系统

Php实现投票系统

数据库设计 创建一个MySQL数据库表来存储投票选项和投票记录。需要两个表:一个存储选项信息,另一个记录用户投票。 CREATE TABLE `poll_options` ( `id` int…