当前位置: 面试刷题>> 将数组拆分成含有连续元素的子序列 (经典算法题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 示例代码

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 示例代码

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 示例代码

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));

码小课网站中有更多相关内容分享给大家学习,包括算法面试题解析、数据结构应用、以及编程技巧等,欢迎访问学习。

推荐面试题