LeetCode 217. Contains Duplicate (Java)

题目:

Given an array of integers, find if the array contains any duplicates.

Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.

Example 1:
Input: [1,2,3,1]
Output: true

Example 2:
Input: [1,2,3,4]
Output: false

Example 3:
Input: [1,1,1,3,3,4,3,2,4,2]
Output: true

解答:

HashSet简单的理解,就是一个由HashMap实现的集合,元素无序且不能重复。HashSet对象中不能存储相同的数据,存储数据时是无序的。但是HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同),是按照哈希值来存的,所以取数据也是按照哈希值取得。

对于平衡二叉搜索树(Java中的TreeSet或TreeMap),search和insert的时间复杂度均为O(logn)。对于哈希表(Java中的HashSet或HashMap),search和insert的平均时间复杂度为o(1)。

//时间复杂度:O(n),search()和insert()各自使用n次,每个操作耗费常数时间
//空间复杂度:O(n),哈希表占用的空间与元素数量是线性关系
class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashSet<Integer> set=new HashSet<>(nums.length);
        for(int i=0;i<nums.length;i++){
            if(set.contains(nums[i]))
                return true;
            else
                set.add(nums[i]);
        }
        return false;
    }
}
class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashMap<Integer,Integer> map=new HashMap<>();
        int j=0;
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(nums[i]))
                return true;
            else
                map.put(nums[i],j);
                j++;
        }
        return false;
    }
}

还有一种解法为本方法使用排序算法。由于比较排序算法,如堆排序,可以在最坏情况下具有O(nlogn)的时间复杂度。因此,排序经常是很好的预处理方法。排序之后,我们可以扫描已排序的数组,以查找是否有任何连续的重复元素。

//时间复杂度:O(nlogn)。排序的复杂度是O(nlogn),扫描的复杂度是O(n)。整个算法主要由排序过程决定,因此是O(nlogn)。
//空间复杂度:O(1)。这取决于具体的排序算法实现,通常而言,使用堆排序是O(1)。

public boolean containsDuplicate(int[] nums) {
    Arrays.sort(nums);
    for (int i = 0; i < nums.length - 1; ++i) {
        if (nums[i] == nums[i + 1]) return true;
    }
    return false;
}

对于一些特定的n不太大的测试样例,哈希表运行速度可能会比排序算法更慢。这是因为哈希表在维护其属性时有一些开销。要注意,程序的实际运行表现和 Big-O 符号表示可能有所不同。Big-O 只是告诉我们在充分大的输入下,算法的相对快慢。因此,在n不够大的情况下,O(n)的算法也可以比O(nlogn)的更慢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值