每日一道算法面试题(9):leecode217:存在重复元素

1.算法题目

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true

示例 2:

输入: [1,2,3,4]
输出: false

示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

2.算法思路

算法思路:

  1. 暴力法:冒泡法思想,逐一检查每个元素在数组中是否存在重复元素,遇到重复元素则返回 true,否则继续遍历,算法复杂度较高O(n^2);
  2. 排序查找算法:考虑到有序数组查找重复元素只需要遍历一次,所以可以通过高效的排序算法将数组元素排序,然后遍历一遍数组即可确定数组是否存在重复元素,算法复杂度是 O(nlogn + n),即 O(nlogn);
  3. 哈希表:

3.算法代码

算法代码:

  1. 根据算法思路1编写的代码比较简单,但在leecode上面提交代码会提示超时,而且代码实现逻辑比较简单就不提供了;
  2. 借助排序算法编写的算法代码如下:
    public static 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;
    }
  1. 根据哈希表思路编写的算法代码如下:
    Set<Integer> set = new HashSet<>(nums.length);
        for (int i = 0; i < nums.length; i ++) {
            if (set.contains(nums[i])) {
                return true;
            }
            set.add(nums[i]);
        }
        return false;

4.总结

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

如果你有疑问或更好的算法思路,欢迎留言交流!!!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页