LeetCode 217——Contains Duplicate(Arrays.sort()的速度体现)

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

 


 

找出数组中重复的数字,没有什么特殊的技巧,解题思路有三种:暴力、hash表和排序,具体解法不详述,下边会有hash表和排序解法的AC代码。

 

这里想说的一点是在Java中使用排序算法,最好使用JDK自带的排序函数:Arrays.sort()。 为什么这么说呢,请看下边的这张图:

排序的解法时间复杂度是O(N\log N),而hash表解法的时间复杂度是O(N),也就是一次遍历就可求解问题,但是最终的结果是排序算法在速度上更快一点。

理论和实际的差距在哪里呢?对于数组等的排序,我们一般使用快速排序算法,但是查看Arrays.sort()函数的源码发现,其中并不是简单的快速排序,而是一种叫做 dual-pivot quick sort的快速排序算法,它针对硬件层面对快速排序做了一些优化,可以达到更好的效果,再加之HashMap在添加元素,扩容等操作上同样需要时间,最终导致了理论和实际的差距。

 


 

hash表解法:

class Solution {
    public boolean containsDuplicate(int[] nums) {
        int numLen = nums.length;
        Map<Integer, Integer> integerMap = new HashMap<>();

        for (int i = 0; i < numLen; ++i) {
            if (integerMap.containsKey(nums[i])) {
                return true;
            } else {
                integerMap.put(nums[i], 1);
            }
        }

        return false;
    }
}

 

排序解法:

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Arrays.sort(nums);
        int numLen = nums.length;

        for (int i = 1; i < numLen; ++i) {
            if (nums[i] == nums[i - 1]) {
                return true;
            }
        }

        return false;
    }
}

 


如有错误,欢迎指摘。也欢迎通过左上角的“向TA提问”按钮问我问题,我将竭力解答你的疑惑。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值