时间:2019.4.12 周五
题目:给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
难度:Easy
思路一:
(1)定义一个HashMap集合
(2)遍历数组,获取每一个int值,用a表示
(3)用a到Map集合中通过map.containsKey(a) 去找,检查其返回值
false: 说明a是第一次出现,就把a作为键,索引作为值存储
true: 说明之前a已经出现过,返回true
(4)如果遍历完数组,说明没有重复元素,返回false
class Solution {
public boolean containsDuplicate(int[] nums) {
// 1.判断数组长度,如果为0或1,返回false
if (nums.length<2) return false;
// 2.定义Map集合
final Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// 3.遍历数组,判断是否存在重复元素
for(int i = 0; i < nums.length; i++) {
boolean flag = map.containsKey(nums[i]);
if(flag == null) {
map.put(nums[i], i);
}else {
return true;
}
}
return false;
}
}
结果分析:O(n)的时间复杂度。
这种思路也可以通过HashSet集合实现
class Solution {
public boolean containsDuplicate(int[] nums) {
// 1.判断数组长度,如果为0或1,返回false
if (nums.length<2) return false;
// 2.判断是否存在重复元素
final Set<Integer> numSet = new HashSet<Integer>();
for(int value : nums) {
if(numSet.contains(value)) {
return true;
} else {
numSet.add(value);
}
}
return false;
}
}
结果分析:O(n)的时间复杂度。
思路二:利用Set集合元素唯一性的特点。将数组转为Set集合,判断Set集合的长度和数组长度是否相等。
class Solution {
public boolean containsDuplicate(int[] nums) {
// 1.判断数组长度,如果为0或1,返回false
if (nums.length<2) return false;
// 2.将数组中的元素存储到Set集合中
final TreeSet<Integer> ts = new TreeSet<Integer>();
for(int value : nums) {
ts.add(value);
}
// 3.比较数组长度和Set集合长度
if(nums.length == ts.size()) {
return false;
} else {
return true;
}
}
}
结果分析:O(n)的时间复杂度。