存在重复元素
问题描述:
给你一个整数数组nums,如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。
思路一:
目前是菜鸟的我唯一想到的思路就是使用两次for循环遍历数组,即:
可想而知,这种方法虽然可以解决问题,但是时间复杂度太高,运行时间超时了,没有通过。
思路二:
但是我也不清楚其他的解决办法,于是上CSDN上查了查,看到了同为小白写的一篇学习日志,提供了另外两种解题思路。一种是利用集合。
代码如下:
为什么要使用集合呢?且为什么要使用set集合呢?
我对集合并不了解,所以又查了一下。
关于集合
集合是一个存放对象引用的容器,位于java.util包下。(下图摘自菜鸟教程,仅供学习记录,不做其他用途)
(以下有些笔记摘自于他人笔记,仅仅是供自己学习记忆,不做其他用途,菜鸟一个,目前只能做摘录)
Java集合框架主要包括两种类型的容器:集合(Collection),存储元素集合;另一种是图(Map),存储键值对映射。
Collection接口有3种子类型:List,Set,Queue。
(1)List,有序,可重复集合。其实现类有:
ArrayList:底层数据结构是数组,查询快,增删慢;线程不安全,效率高;
Vector:底层数据结构是数组,查询快,增删慢;线程安全,效率低;
LinkedList:底层数据结构是链表,查询慢,增删快;线程不安全,效率高;
(2)Set,无序,元素唯一不重复。其实现类有:
HashSet:底层数据结构是哈希表,哈希表依赖两个方法:hashCode()和equals()。
(3)集合与数组的区别(面试题)
①数组和集合都是Java中的容器,但是数组的长度是固定的,集合的长度是可变的;
②数组只能存储相同数据类型的数据,这里的数据类型可以是基本数据类型,也可以是引用数据类型;
③集合可以存储不同数据类型的对象的引用(但一般情况下,会使用泛型来约定只使用一种数据类型),不能存储基本数据类型。
-----------------------------------------------------------分割线------------------------------------------------------------
在查询了一些关于集合的知识后,我大概了解了思路二的做法:通过for循环遍历数组,将数组元素一个个的传进set集合里,因为set集合元素唯一性的特点,如果之前传过某个元素,那么下一个与他相等的元素就无法被添加到集合里。
这是我对向set集合里添加元素并遍历输出的浅尝试:
该思路只用了一次for循环,时间复杂度是O(n),效率比思路一高,运行通过。
思路三:
居然可以一行代码就可以解决问题......
有些方法我不太熟悉,在idea上操作了一下:
distinct()的作用翻译过来大致就是:返回由此流的不同元素组成的流。即该流里是数组里所有不同的元素,那么count()方法好理解,就是这些元素的个数。即,只要不同元素的个数小于数组的长度,那么就说明存在重复元素。这样做也太简单了。
结束语:
目前了解到的以上两种方法,如果以后发现别的方法,会补充记录的。力扣题里分类最简单的一道题,却有如此多的解决办法。坚持吧,多思考。