一个长度为n的数组arr,数组元素范围为0到n-1,数组中没有重复或者有一个或多个重复,如果有重复输出任意一个重复的,无重复输出-1。
思路1:时间复杂度O(n),空间复杂度O(n)
使用哈希表的原理,重新定义一个n长的数组table(默认值全部为0),遍历数组arr,当table[arr[i]] == 0的时候,说明arr[i]第一次出现,否则出现重复。
思路2:时间复杂度O(n),空间复杂度O(1)
对原来的数组进行排序,使用普通常见的排序方法时间复杂度最好的是O(nlogn),但是该数组比较特殊,范围为0 — n-1,所以每次都可以将一个数字放到排好序的位置上,比如i,会放在arr[i]上。遍历数组arr,当arr[i] == i 的时候,说明arr[i]就放在最终位置上,遍历下一个。当不相等的时候,在判断arr[i] == arr[arr[i]],如果相等,则arr[i]重复出现,不相等则交换arr[i] 和 arr[arr[i]]的值,交换后则原来的arr[i]就放到最终的位置上了。接着重复处理新的arr[i]。遍历完,则没有重复出现的数字。
代码:
public static int solution(int[] arr) { int i = 0; while(i < arr.length) { if(arr[i] == i) { i++; } else{ if(arr[i] == arr[arr[i]]) { //说明arr[i]重复出现 return arr[i]; } else { int temp = arr[i]; arr[i] = arr[arr[i]]; arr[temp] = temp; } } } return -1; }