问题描述
小S拥有一条由n颗珠子组成的手链,每颗珠子都有一个对应的颜色编号。她希望将手链上相同颜色的珠子进行去重,只保留每种颜色最后出现的那颗珠子,同时保持珠子原来的相对顺序。
例如,如果珠子的颜色编号是 [1, 2, 1, 3, 4, 2, 4, 4],去重后的珠子颜色应该是 [1, 3, 2, 4]。
问题理解
题目要求去除数组的重复元素,重复元素保留最后一位,返回结果要保持原来的相对顺序。
解题思路
- 要保留重复元素的最后一个元素,就从后往前遍历,已出现过的元素存到一个数组
list中 - 遍历每一位时,要判断当前元素是否在曾经出现过,即是否在
list数组中 - 如果在不做任何处理,如果不在则添加进入
list数组 - 由于得到的
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…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。