当前位置: 面试刷题>> 将数组拆分成含有连续元素的子序列 (经典算法题500道)


### 完整题目描述 题目:**将数组拆分成含有连续元素的子序列** 给定一个未排序的整数数组 `nums`,你需要编写一个函数来找出所有可能的长度为至少为3的连续递增子序列(子序列的长度至少为3),并以列表形式返回它们中字典序最小的序列。 注意: 1. 序列的长度至少为3。 2. 序列中的元素必须是连续的整数。 3. 返回的结果中不能包含重复的子序列。 例如,给定数组 `nums = [1, 2, 3, 3, 4, 4, 5, 6]`,一个可能的输出是 `[[1, 2, 3], [3, 4, 5], [4, 5, 6]]`,因为这些是字典序最小的连续递增子序列,并且没有重复。 ### PHP 示例代码 ```php function findSubsequences($nums) { $result = []; $sequenceMap = []; foreach ($nums as $num) { // 遍历当前数字的潜在前一个数字 for ($prev = $num - 1; $prev >= 0 && isset($sequenceMap[$prev]); $prev--) { $sequences = $sequenceMap[$prev]; foreach ($sequences as $seq) { $newSeq = array_merge($seq, [$num]); if (count($newSeq) >= 3) { $result[] = $newSeq; } // 使用字典序最小的规则来更新后续可能的序列 $sequenceMap[$num][] = $newSeq; } } // 如果当前数字是新的起点,则自己作为起始序列 if (!isset($sequenceMap[$num])) { $sequenceMap[$num] = [[$num]]; } } // 移除重复的子序列 $uniqueResult = []; foreach ($result as $seq) { $uniqueResult[implode(',', $seq)] = $seq; } return array_values($uniqueResult); } // 测试代码 $nums = [1, 2, 3, 3, 4, 4, 5, 6]; print_r(findSubsequences($nums)); ``` ### Python 示例代码 ```python def findSubsequences(nums): result = [] sequence_map = {} for num in nums: for prev in range(num - 1, -1, -1): if prev in sequence_map: for seq in sequence_map[prev]: new_seq = seq + [num] if len(new_seq) >= 3: result.append(new_seq) if num not in sequence_map: sequence_map[num] = [] sequence_map[num].append(new_seq) if num not in sequence_map: sequence_map[num] = [[num]] # 移除重复项 return list({tuple(seq) for seq in result}) # 测试代码 nums = [1, 2, 3, 3, 4, 4, 5, 6] print(findSubsequences(nums)) ``` ### JavaScript 示例代码 ```javascript function findSubsequences(nums) { const result = []; const sequenceMap = {}; for (let num of nums) { for (let prev = num - 1; prev >= 0 && sequenceMap[prev]; prev--) { const sequences = sequenceMap[prev]; for (let seq of sequences) { const newSeq = [...seq, num]; if (newSeq.length >= 3) { result.push(newSeq); } if (!sequenceMap[num]) { sequenceMap[num] = []; } sequenceMap[num].push(newSeq); } } if (!sequenceMap[num]) { sequenceMap[num] = [[num]]; } } // JavaScript 数组去重较复杂,这里简化处理,假设题目已保证结果不重复 // 实际应用中可能需要更复杂的去重逻辑 return result; } // 测试代码 const nums = [1, 2, 3, 3, 4, 4, 5, 6]; console.log(findSubsequences(nums)); ``` **码小课网站中有更多相关内容分享给大家学习**,包括算法面试题解析、数据结构应用、以及编程技巧等,欢迎访问学习。
推荐面试题