自学内容网 自学内容网

【LeetCode100】--- 寻找重复数

题目传送门

方法一:暴力解法(超时)

算法原理

双重循环,每次固定一个数,再遍历别的数。比较这两个数是否相等,

若相等则返回这个数。就是重复数。

复杂度分析 

时间复杂度:O(N方)

空间复杂度:O(1)

代码:

class Solution {
    public int findDuplicate(int[] nums) {
        int n = nums.length;

        for(int i = 0; i < n-1; i++){
            for(int j = i+1; j < n; j++){
                if(nums[i] == nums[j]){
                    return nums[i];
                }
            }
        }
        return -1;
    }
}

 

方法二:哈希表(数组模拟)

算法原理

建立一个大小为n的数组,用来模拟哈希表。

以各个数字作为下标,来统计各个数字出现的次数。

最终遍历这个哈希数组,若有大于1的数,则返回这个下标就是重复出现的数字。

代码:

class Solution {
    public int findDuplicate(int[] nums) {
        int n = nums.length;
        int[] hash = new int[n];

        for(int i = 0; i < n; i++){
            hash[nums[i]]++;
        }

        for(int i = 0; i < n; i++){
            if(hash[i] > 1){
                return i;
            }
        }
        return -1;
    }
}

复杂度分析 

时间复杂度:O(N) 为这个数组的长度

空间复杂度:O(N)为这个数组的长度

 方法三:哈希表(HashSet)

算法原理

创建HashSet这个哈希表。遍历数组,如果这个数字在哈希表中出现了,那么就返回这个数

如果没有出现,那么就将这个数添加到哈希表中。

class Solution {
    public int findDuplicate(int[] nums) {
        Set<Integer> seen = new HashSet<>();

        for(int n : nums){
            if(seen.contains(n)){
                return n;
            }
            seen.add(n);
        }
        return -1;
    }
}

 复杂度分析

时间复杂度:O(N) 为这个数组的长度,遍历的时候为n次

空间复杂度:O(N)为这个数组的长度


原文地址:https://blog.csdn.net/m0_73456341/article/details/145258378

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!