n+1个范围是0~n的数字,找出所有重复的数字,O(n)基础上不用额外空间。
算法思想:
使用数组的值对应数组的下标,出现多对一的则说明重复。
算法:
遍历数组,每次访问前判断数组是否访问过(访问过的会被置为负数);
如果没访问过,则以当前数组的值为数组下标,访问其值:
若为负数,则此元素被访问过,即数组下标在数组值中多次出现,重复;
若非负,则此元素没被访问过,将其标记为访问过(取负值,0取数组长度的负 值);
如果访问过(访问过的数为负数),则再取负为数组下标(如果是数组长度,表明是0),访问其值:
若为负数,则此元素被访问过,即数组下标在数组值中多次出现,重复;
若非负,则此元素没被访问过,将其标记为访问过(取负值,0取数组长度的负 值)。
算法如下:
public static void alg(int[] array){
for(int i=0;i<array.length;i++){
if(0>array[i]){
if(-array.length == array[i]){
if(0>array[0])
System.out.println(0);
}
else if(0>array[-array[i]]){
System.out.println(-array[i]);
}
else{
if(0 == array[-array[i]])
array[-array[i]] = -array.length;
else if(array[-array[i]]>0)
array[-array[i]]=-array[-array[i]];
}
}
else{
if(0>array[array[i]]){
System.out.println(array[i]);
}
else{
if(0 == array[array[i]])
array[array[i]] = -array.length;
else if(array[array[i]]>0)
array[array[i]]=-array[array[i]];
}
}
}
}
测试如下:
public static void main(String[] args) {
int[] array = new int[100];
/* array[0] = 1;
array[1] = 2;
array[2] = 0;
array[3] = 4;
array[4] = 0;*/
for(int i=0;i<100;i++)
array[i]=i;
array[5]=0;
array[1] = 1;
array[3] = 1;
array[89] = 80;
alg(array);
}
算法思想:
使用数组的值对应数组的下标,出现多对一的则说明重复。
算法:
遍历数组,每次访问前判断数组是否访问过(访问过的会被置为负数);
如果没访问过,则以当前数组的值为数组下标,访问其值:
若为负数,则此元素被访问过,即数组下标在数组值中多次出现,重复;
若非负,则此元素没被访问过,将其标记为访问过(取负值,0取数组长度的负 值);
如果访问过(访问过的数为负数),则再取负为数组下标(如果是数组长度,表明是0),访问其值:
若为负数,则此元素被访问过,即数组下标在数组值中多次出现,重复;
若非负,则此元素没被访问过,将其标记为访问过(取负值,0取数组长度的负 值)。
算法如下:
public static void alg(int[] array){
for(int i=0;i<array.length;i++){
if(0>array[i]){
if(-array.length == array[i]){
if(0>array[0])
System.out.println(0);
}
else if(0>array[-array[i]]){
System.out.println(-array[i]);
}
else{
if(0 == array[-array[i]])
array[-array[i]] = -array.length;
else if(array[-array[i]]>0)
array[-array[i]]=-array[-array[i]];
}
}
else{
if(0>array[array[i]]){
System.out.println(array[i]);
}
else{
if(0 == array[array[i]])
array[array[i]] = -array.length;
else if(array[array[i]]>0)
array[array[i]]=-array[array[i]];
}
}
}
}
测试如下:
public static void main(String[] args) {
int[] array = new int[100];
/* array[0] = 1;
array[1] = 2;
array[2] = 0;
array[3] = 4;
array[4] = 0;*/
for(int i=0;i<100;i++)
array[i]=i;
array[5]=0;
array[1] = 1;
array[3] = 1;
array[89] = 80;
alg(array);
}