剑指offer03数组中重复的数字

72 阅读1分钟

🍀数组中重复的数字

描述:

 # 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
 ​
 示例 1:
 ​
 输入:
 [2, 3, 1, 0, 2, 5, 3]
 输出:23 
 ​
 限制:
 2 <= n <= 100000

思考:

这个题目看起来很简单,但是在面试过程中往往不是这样直给的形式出现的,而是有着时间和空间的要求!下面是三种时间和空间上有要求的三种情况。

实现:

第一种:时间O(n),空间O(n)

这种最容易想到,但是空间以及时间都极其浪费!

 class Solution {
     public int findRepeatNumber(int[] nums) {
         int[] arr = new int[nums.length];
         for (int i = 0; i < nums.length; i++) {
             arr[nums[i]]++;
             if (arr[nums[i]] > 1){
                 return nums[i];
             }
         }
         return -1;
     }
 }

测试一下!

image.png

第二种:时间O(nlogn),空间O(1)

这种是先进行排序再进行查找,因此空间上很节约。

 class Solution2 {
     public int findRepeatNumber(int[] nums) {
 ​
         int pre;
 ​
         Arrays.sort(nums);
         pre = nums[0];
 ​
         for (int i = 1; i < nums.length; i++) {
             if (nums[i] == pre){
                 return nums[i];
             }
             pre = nums[i];
         }
         return -1;
     }
 }

测试一下!

image.png

第三种:时间O(n),空间O(1)

 class Solution3 {
     public int findRepeatNumber(int[] nums) {
 ​
         int temp;
 ​
         for (int i = 0; i < nums.length; i++) {
             while (nums[i] != i){
                 if (nums[nums[i]] == nums[i]){
                     return nums[i];
                 }
                 temp = nums[i];
                 nums[i] = nums[nums[i]];
                 nums[nums[i]] = temp;
             }
         }
 ​
         return -1;
     }
 }
 ​

测试一下!

\