求最长上升子序列的长度【php版】

在这里插入图片描述

动态规划_1
思路:以dp[i]表示以第i位结尾的递增子序列的最大长度,则 dp[i] = max(dp[i], dp[j] + 1(if nums[j] < nums[i])) (j from 0 -> i);

	function lengthOfLIS($nums) {
		$dp = array_fill(0, count($nums), 1);
		$max = 1;
		foreach($nums as $k => $num) {
			for ($i=0; $i<=$k; $i++) {
				if ($num > $nums[$i]) {
					$dp[$k] = max($dp[$k], $dp[$i]+1);
				}
			}
			$max = max($max, $dp[$k]);
		}
		return $max;
	}

贪心
实质上是找递增最慢的子序列的长度,以dp[i] = a, 表示 以a结尾的子序列的长度为i

	function lengthOfLIS_v2($nums) {
		$len = count($nums);
		if ($len == 0) return 0;
		$dp[0] = $nums[0];
		for ($i=1; $i<$len; $i++) {
			$end = count($dp) - 1;
			$start = 0;
			while ($start < $end) {
				$mid = $start + intdiv($end-$start, 2);
				if ($dp[$mid] >= $nums[$i]) {
					$end = $mid;
				} else {
					$start = $mid + 1;
				}
			}
			if ($dp[$start] > $nums[$i]) {
				$dp[$start] = $nums[$i];
				continue;
			}
			if ($dp[$start] !== $nums[$i]) {
				$dp[$start+1] = $nums[$i];
			}
		}
		return count($dp);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值