当前位置: 面试刷题>> 升序子序列 (经典算法题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 示例代码 ```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 示例代码 ```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 示例代码 ```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); ``` **码小课**网站中有更多关于算法和数据结构的相关内容分享给大家学习,欢迎访问以获取更多知识和实践机会。
推荐面试题