问题描述: 小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]
解题思路:
- 创建一个字典
last_occurrence来记录每种颜色最后出现的位置。 - 从后向前遍历珠子的颜色列表,这样我们可以确保记录的是每种颜色最后出现的位置。
- 遍历完成后,我们有了每种颜色最后出现的位置,然后我们再次遍历原始列表,按照原始顺序构建去重后的列表。
解题步骤:
- 初始化一个空字典
last_occurrence。 - 从后向前遍历列表a,如果颜色没有在
last_occurrence中出现过,则将其添加到字典中,并记录其位置。 - 初始化一个空列表
result。 - 再次遍历列表a,对于每个元素,检查其颜色是否在
last_occurrence的值中,如果是,则将其添加到result中。 - 返回
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])
解题思路详细解析:
- 我们首先创建一个字典
last_occurrence来记录每种颜色最后出现的位置。字典的键是颜色,值是该颜色最后出现的位置。 - 我们从后向前遍历列表a,这样做的原因是确保我们记录的是每种颜色最后出现的位置。如果颜色在
last_occurrence中已经存在,我们不会更新它,因为我们只关心最后出现的位置。 - 在遍历完成后,我们有了每种颜色最后出现的位置。然后我们再次遍历原始列表a,这次我们按照原始顺序构建去重后的列表
result。 - 对于列表a中的每个元素,我们检查其位置是否在
last_occurrence的值中。如果是,这意味着它是该颜色最后出现的元素,我们将其添加到result中。
复杂度分析:
时间复杂度:O(n),其中n是列表a的长度。我们需要两次遍历列表a。
空间复杂度:O(n),最坏情况下,字典last_occurrence可能包含列表a中所有不同的颜色,因此其大小可能达到n。