1,问题简述
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
2,示例
输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]
3,题解思路
数组的使用
4,题解程序
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class FindDuplicatesTest {
public static void main(String[] args) {
int[] nums = {4, 3, 2, 7, 8, 2, 3, 1};
List<Integer> integerList = findDuplicates(nums);
System.out.println("integerList = " + integerList);
}
public static List<Integer> findDuplicates(int[] nums) {
List<Integer> list = new ArrayList<>();
if (nums == null || nums.length == 0) {
return list;
}
int maxValue = Arrays.stream(nums).max().getAsInt();
int[] array = new int[maxValue + 1];
for (int num : nums) {
array[num]++;
}
for (int i = 0, length = array.length; i < length; i++) {
if (array[i] == 2) {
list.add(i);
}
}
return list;
}
}
5,题解程序图片版
6,总结
数组的特点就是访问快,数组空间不可动态扩容,访问快在于根据数组下标进行确定元素的位置,相比较于链表获取数组元素的时间复杂度在O(1),链表由于节点的关系,查找某个元素的时间复杂度为O(n)