这是悦乐书的第192次更新,第196篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第52题(顺位题号是217)。给定一个整数数组,查找数组是否包含任何重复项。如果数组中至少出现两次值,则函数应返回true,如果每个元素都不相同,则返回false。例如:

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

输出:true

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

输出:false

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

输出:true

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

使用两层for循环,外层控制当前元素,内层控制剩下的元素,依次比较,发现重复元素即可返回false。

此解法的时间复杂度是O(n^2),空间复杂度是O(1)。

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

03 第二种解法

使用HashMap,借助其put(key,value)方法,如果key在map中已经存在,则返回此key所对应的value,反之如果key不存在,返回null。所以,数组中的元素存在重复值时,进行put操作时是不会返回null的。

此解法的时间复杂度是O(n),空间复杂度是O(n)。

public boolean containsDuplicate2(int[] nums) {
if (nums == null || nums.length <= 1) {
return false;
}
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for (int i=0; i < nums.length; i++) {
if (map.put(nums[i], i) != null) {
return true;
}
}
return false;
}

04 第三种解法

使用HashSet,借助其add方法,如果当前元素已经存在则返回false,说明存在重复元素。

此解法的时间复杂度是O(n),空间复杂度是O(n)。

public boolean containsDuplicate3(int[] nums) {
if (nums == null || nums.length <= 1) {
return false;
}
Set<Integer> set = new HashSet<>();
for (int i=0; i<nums.length; i++) {
if (!set.add(nums[i])) {
return true;
}
}
return false;
}

05 第四种解法

先将数组排序,利用Arrays.sort()方法,然后使用for循环依次比较相邻的元素,如果相等,则存在重复元素。

此解法的时间复杂度是O(nlog(n)),空间复杂度是O(1)。

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

06 第五种解法

利用IntStream接口,此接口是Java8的新特性,of()方法是将其内的参数转换为Stream,distinct()方法是去掉Stream中的重复元素,count()是对Stream中的元素记数。

public boolean containsDuplicate5(int[] nums) {
return IntStream.of(nums).distinct().count() < nums.length;
}

07 有问题的一种解法

此解法是该道题目所有Submissions中排第一的解法,测试综合用时是1毫秒,应该是击败了100%的提交,但是该解法有一点问题。

public boolean containsDuplicate6(int[] nums) {
if (nums == null || nums.length <= 1) {
return false;
}
for (int i = 0; i < nums.length; i++) {
for (int j = i - 1; j > -1; j--) {
if (nums[i] > nums[j]) {
break;
} else if (nums[i] == nums[j]) {
return true;
}
}
}
return false;
}

问题所在:进入内层循环时,如果当前元素大于前一个元素,那么结束内层循环,进入外层循环下一次循环。如果该重复的元素正好在其前面的元素中,那就产生了误判,例如此数组{25,2,25},当外层循环判断到第3个元素,即25时,25大于第二个元素2,直接break,进入外层循环,已经遍历完所有元素,最后返回false,但是此数组应该是要返回true的。

一个没有排过序的数组,直接判断相邻的元素来决定是否重复,很容易误判,不知道为什么此解法还能被AC。

08 小结

算法专题目前已连续日更超过一个月,算法题文章52+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Contains Duplicate(Java实现)的更多相关文章

  1. LeetCode算法题-Contains Duplicate II(Java实现)

    这是悦乐书的第193次更新,第197篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第53题(顺位题号是219).给定整数数组和整数k,找出数组中是否存在两个不同的索引i和 ...

  2. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  3. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  4. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  5. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  6. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  7. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  8. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  9. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

随机推荐

  1. 29.QT-自定义窗口拖动、自定义QToolButton/QPushButton开关按钮、界面阴影,声音等总结

    自定义窗口及拖动 1.自定义无边框窗口时,需要将窗口标志设为: Qt::FramelessWindowHint |Qt::WindowSystemMenuHint | Qt::WindowMinMax ...

  2. spring boot 打jar包,获取resource路径下的文件

    前言:最近在spring boot项目静态类中获取resource路径下文件,在idea中启动都可以获取,但是打包后变成了jar包 就无法获取到. 我想到了两种方法,一种是根据http访问静态资源比如 ...

  3. Tri Tiling(hdu1143)

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. 汇编语言--微机CPU的指令系统(五)(条件设置字节指令)

    (10)条件设置字节指令 条件设置字节指令(Set Byte Conditionally)是80386及其以后CPU所具有的一组指令.它们在测试条件方面与条件转移是一致的,但在功能方面,它们不是转移, ...

  5. PHP无限分类分类导航LINK的代码实现

    1. 代码数据库的结构: 2.要达到的效果 /** * @param php无限分类分类导航LINK的代码实现 */ include('db.inc.php'); function getCatePa ...

  6. js获取对象的长度

    var obj= { "name": "wuqian", "sex": "famale", "hello&qu ...

  7. Vue2+VueRouter2+webpack 构建项目实战(二):目录以及文件结构

    通过上一篇博文<Vue2+VueRouter2+webpack 构建项目实战(一):准备工作>,我们已经新建好了一个基于vue+webpack的项目.本篇文章详细介绍下项目的结构. 项目目 ...

  8. react-fetch数据发送请求

    在一个项目中,数据的请求发送数据是最为重要的,不可能我们的数据都是自己进行编写的 在react中官方推荐使用的方法是fetch.当然它里面也可以使用vue中的axios请求数据,jQuery的$.aj ...

  9. react-router-dom v^4路由、带参路由的配置

    首先安装路由 npm install --save react-router-dom 新建一个router.js文件 然后我们的router.js代码如下↓ import React from 're ...

  10. 深入理解Java虚拟机03--垃圾收集器与内存分配策略

    一.概述  哪些内存需要回收? 什么时候回收? 如何回收? 二.对象已死吗  1.引用计数算法  定义:给对象添加一个引用计数器,当增加一个引用时,加1,当一个引用时,减1; 缺陷:当对象之间互相循环 ...