引用:http://blog.csdn.net/yutianzuijin/article/details/53861485
本文主要解析《Find All Numbers Disappeared in an Array》,顺便简单解释一下《Find All Duplicates in an Array》。
该题的含义是:给定一个长度为n的数组,数组元素是1~n。但是有些元素出现一次,有些元素出现两次,从而也会导致有些元素不出现。现在让我们找到哪些元素没有出现。另外一个题目是让我们找到出现两次的元素。时间复杂度O(n),空间复杂度O(1)。
第一种方法是—元素归位法。元素归位法很容易理解,就是将n个元素交换到它应该在的位置。例如,元素5就放到位置4(下标从0开始)。这里需要注意一点,将某个元素交换到正确位置可能会导致当前位置的元素还不在正确位置,需要继续交换直到不能交换为止。
public static void xx() {
for (int i = 0; i < A.length; i++) {
if (A[i] != (i + 1)) {
swap(i, A[i] - 1);
}
}
for (int i = 0; i < A.length; i++) {
if (A[i] != i + 1) {
A[A[i] - 1] += A[i];
}
}
for (int i = 0; i < A.length; i++) {
System.out.println((i + 1) + " " + A[i] + " occurs " + (A[i] / (i + 1)) + " times.");
}
}
第二种方法是取余法:
public static void sss(int[] n) {
int length = n.length;
for (int i = 0; i < length; i++) {
n[i]--;//和下标匹配,因为从1开始。如果是从0开始,就不需要了
}
for (int i = 0; i < length; i++) {
n[n[i] % length] += length;
}
for (int i = 0; i < length; i++) {
System.out.println((i + 1) + " " + n[i] + " occurs " + (n[i] / length) + " times.");
}
}