当前位置: 面试刷题>> 升序子序列 (经典算法题500道)


题目描述补充

题目:升序子序列

给定一个整数数组 nums,你的任务是找出数组中所有可能的严格递增子序列的长度,并以列表(或数组)形式返回这些长度,不需要返回具体的子序列本身。

注意

  • 数组中的元素可能不唯一。
  • 递增子序列是指子序列中的元素从左到右依次增大,但不必连续。

示例

输入:nums = [4, 6, 7, 7] 输出:[1, 2, 3, 4] 解释:可能的递增子序列有 [4], [6], [7], [4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7],对应长度分别为 1, 1, 1, 2, 2, 3, 4。

PHP 示例代码

function lengthOfLIS($nums) {
    $n = count($nums);
    $dp = array_fill(0, $n, 1); // 初始化dp数组,每个元素至少为1(自身为子序列)
    $maxLength = 1;

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

    // 生成所有可能的长度
    $result = [];
    for ($len = 1; $len <= $maxLength; $len++) {
        $result[] = $len;
    }

    return $result;
}

// 示例用法
$nums = [4, 6, 7, 7];
$result = lengthOfLIS($nums);
print_r($result);

Python 示例代码

def lengthOfLIS(nums):
    n = len(nums)
    dp = [1] * n  # 初始化dp数组,每个元素至少为1
    maxLength = 1

    for i in range(1, n):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)
        maxLength = max(maxLength, dp[i])

    # 生成所有可能的长度
    return list(range(1, maxLength + 1))

# 示例用法
nums = [4, 6, 7, 7]
result = lengthOfLIS(nums)
print(result)

JavaScript 示例代码

function lengthOfLIS(nums) {
    const n = nums.length;
    const dp = new Array(n).fill(1); // 初始化dp数组
    let maxLength = 1;

    for (let i = 1; i < n; i++) {
        for (let j = 0; j < i; j++) {
            if (nums[i] > nums[j]) {
                dp[i] = Math.max(dp[i], dp[j] + 1);
            }
        }
        maxLength = Math.max(maxLength, dp[i]);
    }

    // 生成所有可能的长度
    const result = [];
    for (let len = 1; len <= maxLength; len++) {
        result.push(len);
    }

    return result;
}

// 示例用法
const nums = [4, 6, 7, 7];
const result = lengthOfLIS(nums);
console.log(result);

码小课网站中有更多关于算法和数据结构的相关内容分享给大家学习,欢迎访问以获取更多知识和实践机会。

推荐面试题