剑指offer 3
题目描述:在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
解题思路:
方法一
- 先排序,之后顺序扫描判断是否有重复,时间复杂度为O(n^2)
方法二,时间复杂度为O(n)
- 长度为n,元素的范围也为0~n,如果没有重复元素,则n下标的值也等于n
- 从头到尾扫描数组,当扫描到下标i的值arr[i]时:
- 如果arr[i]的值与下标i相等,继续向下扫描,i++;
- 如果arr[i]与下标i不相等,比较arr[arr[i]]与arr[i]的值,如果相等,返回arr[i]的值,否则交换下标i与下标arr[i]的值,重复这个过程,直至找到为止
方法三:
- 利用哈希表,遍历数组,如果哈希表中没有该元素,则存入哈希表中,否则返回重复的元素。时间复杂度为 O(n),空间复杂度为 O(n)。
方法一代码如下:
import java.util.Arrays;
public class DuplicationArray {
/**
* 先排序,之后判断是否有重复
* @param args
*/
public static void main(String[] args) {
int[] arr = {
2, 3, 1, 0, 2, 5, 3};
Arrays.sort(arr); //利用库函数进行排序
boolean flag = duplicated(arr); //将排序数组传入进行判断
System.out.println(flag);
}
public <