不修改数组找出重复的数字
不修改数组找出重复的数字
题目
在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但是不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。
题解
思路1
由于不能修改输入的数组,我们可以创建一个长度为n+1的辅助数组,然后逐一把原数组的每个数字复制到辅助数组。
如果原数组中被复制的数字是m,则把它复制到辅助数组中下标为m的位置。
如果下标为m的位置上已经有数字了,则说明该数字重复了。
由于使用了辅助空间,故该方案的空间复杂度是O(n)
static void findByCopyArray(int[] n){ int[] cp = new int[n.length+1]; //初始化 for (int i = 0; i<n.length; i++) cp[i] = -1; for (int i = 0; i<n.length; i++){ if (cp[n[i]] == -1) cp[n[i]] = n[i]; else System.out.print(n[i]+" "); } }