【478】珠子颜色去重| 豆包MarsCode AI刷题

92 阅读3分钟

问题描述: 小S拥有一条由n颗珠子组成的手链,每颗珠子都有一个对应的颜色编号。她希望将手链上相同颜色的珠子进行去重,只保留每种颜色最后出现的那颗珠子,同时保持珠子原来的相对顺序。

例如,如果珠子的颜色编号是[1, 2, 1, 3, 4, 2, 4, 4],去重后的珠子颜色应该是[1, 3, 2, 4]。

测试样例: 样例1:

输入:n = 8, a = [1, 2, 1, 3, 4, 2, 4, 4] 输出:[1, 3, 2, 4]

样例2:

输入:n = 5, a = [5, 5, 5, 5, 5] 输出:[5]

样例3:

输入:n = 6, a = [6, 1, 2, 6, 1, 2] 输出:[6, 1, 2]

解题思路:

  1. 创建一个字典last_occurrence来记录每种颜色最后出现的位置。
  2. 从后向前遍历珠子的颜色列表,这样我们可以确保记录的是每种颜色最后出现的位置。
  3. 遍历完成后,我们有了每种颜色最后出现的位置,然后我们再次遍历原始列表,按照原始顺序构建去重后的列表。

解题步骤:

  1. 初始化一个空字典last_occurrence
  2. 从后向前遍历列表a,如果颜色没有在last_occurrence中出现过,则将其添加到字典中,并记录其位置。
  3. 初始化一个空列表result
  4. 再次遍历列表a,对于每个元素,检查其颜色是否在last_occurrence的值中,如果是,则将其添加到result中。
  5. 返回result列表。

解题代码:

def solution(n: int, a: list) -> list:
    # 用于记录每种颜色最后出现的位置
    last_occurrence = {}
    
    # 从后向前遍历珠子的颜色列表
    for i in range(n-1, -1, -1):
        if a[i] not in last_occurrence:
            last_occurrence[a[i]] = i
    
    # 根据字典中的记录,按顺序构建去重后的列表
    result = []
    for i in range(n):
        if i in last_occurrence.values():
            result.append(a[i])
    
    return result

if __name__ == '__main__':
    print(solution(8, [1, 2, 1, 3, 4, 2, 4, 4]) == [1, 3, 2, 4])
    print(solution(5, [5, 5, 5, 5, 5]) == [5])
    print(solution(6, [6, 1, 2, 6, 1, 2]) == [6, 1, 2])

解题思路详细解析:

  1. 我们首先创建一个字典last_occurrence来记录每种颜色最后出现的位置。字典的键是颜色,值是该颜色最后出现的位置。
  2. 我们从后向前遍历列表a,这样做的原因是确保我们记录的是每种颜色最后出现的位置。如果颜色在last_occurrence中已经存在,我们不会更新它,因为我们只关心最后出现的位置。
  3. 在遍历完成后,我们有了每种颜色最后出现的位置。然后我们再次遍历原始列表a,这次我们按照原始顺序构建去重后的列表result
  4. 对于列表a中的每个元素,我们检查其位置是否在last_occurrence的值中。如果是,这意味着它是该颜色最后出现的元素,我们将其添加到result中。

复杂度分析: 时间复杂度:O(n),其中n是列表a的长度。我们需要两次遍历列表a。 空间复杂度:O(n),最坏情况下,字典last_occurrence可能包含列表a中所有不同的颜色,因此其大小可能达到n。