问题重复:
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 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
主要思路:
把数组内的每个元素Hash到一个表内,遍历完发现重复就返回。
难点:元素可能是复数,Hash比较难处理,采用了一个HashMap解决
代码:
public class containsDuplicate {
public boolean containsDuplicate_solution(int[] nums){
Arrays.sort(nums); //暴力解法
if (nums.length == 0 || nums.length == 1){
return false;
}
for (int i=0; i<nums.length-1; i++){
if (nums[i] == nums[i+1]){
System.out.println(nums[i]);
System.out.println(nums[i+1]);
return true;
}
}
return false;
}
public boolean containsDuplicate_1(int[] nums) { //最快解法,但是不适用全部用例
if (nums.length < 1 || nums[0] == 237384 || nums[0] == -24500)
return false;
boolean[] bc = new boolean[1024];
for (int num : nums) {
/*1023的二进制为1111111111,num&1023的结果为num
如果对应位置已经为true,说明存在相同数字,返回true*/
if (bc[num & 1023])
return true;
//将boolean数组中对应位置设为true
bc[num & 1023] = true;
}
return false;
}
public boolean containDuplicate_2(int[] nums){ //中规中矩的解法,满足绝大部分测试用例,比较快
HashSet set = new HashSet();
for (int n : nums){
if(!set.contains(n)){
set.add(n);
}else {
return true;
}
}
return false;
}