剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
package com.coco.learnalgorithmone.array;import java.util.*;/*** 剑指 Offer 03. 数组中重复的数字* 找出数组中重复的数字。*** 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。* 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。* 请找出数组中任意一个重复的数字。*/public class FindRepeatNumber {public static void main(String[] args) {int[] nums = {2, 3, 1, 0, 2, 5, 3};System.out.println(findRepeatNumber1(nums));System.out.println(findRepeatNumber2(nums));System.out.println(findRepeatNumber3(nums));System.out.println(findRepeatNumber4(nums));}public static int findRepeatNumber1(int[] nums) {Set<Integer> numSet = new HashSet<>();for (int num : nums) {if (numSet.contains(num)) {return num;}numSet.add(num);}return -1;}public static int findRepeatNumber2(int[] nums) {Arrays.sort(nums);for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i - 1]) {return nums[i];}}return -1;}public static int findRepeatNumber3(int[] nums) {int[] tmp = new int[nums.length];for (int num : nums) {if (tmp[num] != 0) {return num;}tmp[num] = 1;}return -1;}public static int findRepeatNumber4(int[] nums) {for (int i = 0; i < nums.length; i++) {int num = nums[i];if (num != i) {int corr = nums[num];if (num == corr) {return num;}nums[i] = corr;nums[num] = num;--i;}}return -1;}}
findRepeatNumber1
思路:利用Set集合的特性,遍历数组,往集合中新增num,当新增的num已经存在Set集合中时,代表num重复出现。
findRepeatNumber2
思路:将数组从小到大排序,遍历数组,比较相邻的两个num,当相等时,代表num重复出现。
findRepeatNumber3
思路:根据题目得知数组中num的范围在[0, n-1]区间,由此创建一个与数组长度一致的临时数组,用于记录每一个索引上num的状态。
遍历数组,往临时数组的num索引上赋值1。若临时数组的num索引上的值不为0,则代表num重复出现。
