悠悠楠杉
网站页面
正文:
在Java开发中,处理数组去重是一个常见需求。无论是为了优化数据存储,还是为了满足业务逻辑,去重操作都要求开发者对循环逻辑有深刻理解。本文将围绕两种主流方法——哈希表法和双指针法,深入解析其实现原理和适用场景。
哈希表(HashSet)是去重操作中最直观的解决方案。其核心思想是利用哈希表的唯一性特性,通过遍历数组将元素存入哈希表,自动过滤重复值。
HashSet对象存储唯一元素。HashSet中。HashSet转换回数组(可选)。示例代码:
import java.util.HashSet;
public class UniqueElements {
public static int[] removeDuplicates(int[] arr) {
HashSet<Integer> set = new HashSet<>();
for (int num : arr) {
set.add(num);
}
int[] result = new int[set.size()];
int index = 0;
for (int num : set) {
result[index++] = num;
}
return result;
}
}
优点:时间复杂度为O(n),效率高。
缺点:需要额外空间存储哈希表,不适合内存敏感的场景。
如果数组已排序,可以通过双指针法实现原地去重,无需额外空间。该方法通过快慢指针的协作,将不重复的元素移动到数组前部。
slow(从0开始)。fast遍历数组,发现与slow不同的元素时,将其赋值给slow+1的位置。slow+1作为去重后的数组长度。示例代码:
public class UniqueElements {
public static int removeDuplicates(int[] arr) {
if (arr.length == 0) return 0;
int slow = 0;
for (int fast = 1; fast < arr.length; fast++) {
if (arr[fast] != arr[slow]) {
arr[++slow] = arr[fast];
}
}
return slow + 1;
}
}
优点:空间复杂度O(1),适合已排序数组。
缺点:要求数组预先排序,否则无法生效。
| 方法 | 时间复杂度 | 空间复杂度 | 适用场景 |
|-------------|------------|------------|-----------------------|
| 哈希表法 | O(n) | O(n) | 通用场景,无需排序 |
| 双指针法 | O(n) | O(1) | 已排序数组,内存敏感 |
实际开发建议:
- 若数组未排序且内存充足,优先选择哈希表法。
- 若数组已排序或需节省内存,使用双指针法。
LinkedHashSet使用。