最长增长子序列 PHP,动态规划算法:查找数组中最长上升子序列长度【leetcode-300】PHP...

class Solution {

/**

* @param Integer[] $nums

* @return Integer

*/

function lengthOfLIS($nums) {

$count = count($nums);

//空数组的最长子序列长度是0

if($count == 0){

return 0;

}

//初始每个位置的最长子序列长度是1

$lis = [];

foreach($nums as $k=>$val){

$lis[$k] = 1;

}

//从i=1个位置,考察最长上升子序列

for($i=1;$i

$max_flag = 0;//是否在[0,i)区间里面找到比i的值小的值。

$max = 1;

//在[0,i)区间里面找到i位置的最长上升子序列长度

//再根据之前找到的最长上升子序列长度,找到现在的最长上升子序列长度

//上面就是重叠子问题,通过自底向上的方式,解决问题,就是动态规划。

for($j=0;$j

//如果位置j的值小于当前位置i的值

if($nums[$j] < $nums[$i] ){

//当前的最长上升子序列长度和位置j的最长上升子序列长度的最大值

//附件介绍:当前位置i的最长上升子序列长度=1,还在计算中。

$max = max($max,$lis[$j]);

//$max就是i前面的最长上升子序列

$max_flag = 1;

}

//如果找到了比nums[$i]小的值,那么就需要位置i的最长上升子序列更新

if($max_flag == 1){

$lis[$i] = $max +1;

}

}

//内层for循环完成之后,就找到位置i的最长上升子序列的长度

}

//最后返回最大的,就是数组中,最长上升子序列的长度

return max($lis);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值