Leetcode面试题03.数组中重复的数字

题目描述

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

说明:

2 <= n <= 100000

题解

哈希表(java)

思路:是哈希表tag下较为简单的一道题。上来就直接省事用哈希表HashMap的结构来解决,其实并没有必要,还浪费空间。

class Solution {
    public int findRepeatNumber(int[] nums) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int num: nums) {
            if(map.containsKey(num)) return num;
            map.put(num,2);
        }
        return -1;
    }
}

复杂度分析

  • 时间复杂度: O ( N ) O(N)
  • 空间复杂度: O ( N ) O(N)

哈希表2(java)

思路:用set的结构可以更清晰一点,成功添加则查看下一个元素,不行则返回当前元素。

class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        int repeat = -1;
        for (int num : nums) {
            if (!set.add(num)) {
                repeat = num;
                break;
            }
        }
        return repeat;
    }
}
  • 时间复杂度: O ( N ) O(N)
  • 空间复杂度: O ( N ) O(N)

交换法(java)

思路:抓住题目条件,数字长度为 n n ,且里面的数值都在0到 n 1 n-1 的范围内,其实可以理解为,如果没有重复的话,那对每个数值来说,就是一个萝卜一个坑。那么就可以依次对数组中的每个元素归位,如果在归位过程中,遇到重复,则返回该数。虽然也是 O ( N ) O(N) 的时间复杂度,但运行起来比前两个方法快很多。

class Solution {
    public int findRepeatNumber(int[] nums) {
        int temp;
        for(int i=0;i<nums.length;i++){
            while (nums[i]!=i){
                if(nums[i]==nums[nums[i]]){
                    return nums[i];
                }
                temp=nums[i];
                nums[i]=nums[temp];
                nums[temp]=temp;
            }
        }
        return -1;
    }
}
  • 时间复杂度: O ( N ) O(N)
  • 空间复杂度: O ( 1 ) O(1)
发布了43 篇原创文章 · 获赞 20 · 访问量 1447

猜你喜欢

转载自blog.csdn.net/Chen_2018k/article/details/104889883