470 珠子颜色去重 | 豆包MarsCode AI刷题

56 阅读2分钟

问题描述

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

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

问题理解

题目要求去除数组的重复元素,重复元素保留最后一位,返回结果要保持原来的相对顺序。

解题思路

  1. 要保留重复元素的最后一个元素,就从后往前遍历,已出现过的元素存到一个数组 list
  2. 遍历每一位时,要判断当前元素是否在曾经出现过,即是否在 list 数组中
  3. 如果在不做任何处理,如果不在则添加进入 list数组
  4. 由于得到的 list 是逆序的,将这个 list 翻转就得到输出结果

代码详解

public static int[] solution(int n, int[] a) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = a.length -1; i >= 0; i--) {
            if (!list.contains(a[i])) {
                list.add(a[i]);
            }
        }
        Collections.reverse(list);
        return list.stream().mapToInt(i -> i).toArray();
    }

复杂度计算

空间复杂度:O(n)

时间复杂度:O(n^2)。for 循环次数为 n(数组长度)。在每次循环中,调用 list.contains(a[i]) 方法,时间复杂度为 O(m),所以总时间复杂度为 O(n * m),在最坏情况下,m 可以达到 n,所以总时间复杂度为 O(n^2)Collections.reverse(list) 时间复杂度为 O(m)list.stream().mapToInt(i -> i).toArray() 时间复杂度为 O(m),其中 m 是 list 的大小。

总时间复杂度

  • 主要的时间复杂度来自于 for 循环中的 list.contains 方法,因此总时间复杂度为 O(n^2)

知识点总结

  • mapToInt(i -> i) 将 Stream 中的每个 Integer 元素映射为 int 类型。
  • toArray() 将 IntStream 转换为一个 int[] 数组
  • Collections 工具类: 提供了许多静态方法来操作集合,如反转列表。
  • Stream API: 用于高效处理集合数据,如将 ArrayList 转换为 int[] 数组。list.stream() 将 ArrayList 转换为一个 Stream 对象。
  • 数组操作: 包括遍历数组、比较数组等。
  • Lambda 表达式: 简化代码,特别是在使用 Stream 时。

其他方法

当前的时间复杂度为 O(n^2),主要是因为 list.contains 方法的时间复杂度较高。

可以考虑使用 HashMap 来记录每种颜色最后出现的位置,从而将时间复杂度优化到 O(n)

作者:Hewson
链接:juejin.cn/post/744189…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。