5 找重复数
给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false
思路1:使用快速排序将数组排序,然后遍历看相邻元素是否相等 ----- 提交超时了!!!!!!
class Solution { public void quickSort(int a[], int left, int right) { if(left > right) { return; } int pivot = a[left]; int i = left; int j = right; while(i < j) { while(pivot <= a[j] && i < j) { j--; } while(pivot >= a[i] && i < j) { i++; } if(i < j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } a[left] = a[i]; a[i] = pivot; quickSort(a, left, i-1); quickSort(a, i+1, right); } public boolean containsDuplicate(int[] nums) { quickSort(nums, 0, nums.length-1); for (int i = 0; i < nums.length-1; i++) { if (nums[i] == nums[i+1]) { return true; } } return false; } }
思路2:双层遍历,找出相等值 ------ 也超时啦!
class Solution { public boolean containsDuplicate(int[] nums) { 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; } }
思路3:设置一个哈希表,将数组的值存入哈希表中,利用哈希表中不可以存储重复元素的特性,根据哈希表长度和数组长度作对比,看最后是否相等
class Solution { public boolean containsDuplicate(int[] nums) { HashSet<Integer> hashSet = new HashSet<Integer>(); for (int i = 0; i < nums.length; i++) { hashSet.add(nums[i]); } if (hashSet.size() == nums.length) { return false; } else { return true; } } }
思路4(看了题解有个排序,然后自己思考):同思路1,先经过排序,在根据查看相邻数据是否相等,判断结果,只不过排序方式变成了调用Arrays的sort()方法
class Solution { public 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; } }
执行用时击败 99.74% , 内存消耗击败 88.96%
思路5(看了题解):类似于自己想的思路3,也是通过哈希表,但是这个是通过遍历数组元素看数组元素是否能顺利的加进哈希表中
class Solution { public boolean containsDuplicate(int[] nums) { Set<Integer> set = new HashSet<Integer>(); for (int x: nums) { if (!set.add(x)) { return true; } } return false; } }
执行用时击败 91.50%,内存消耗击败 51.25%
这个方法比我想的循环的少,我的是把所有的元素全都加进去哈希表,最后在比较,他的事如果加不进去直接返回结果,少了判断的过程还有后面从加不进去往后的哈希表的内存和时间!
思路6(题解):Java骚操作:用 stream 实现一行将 int[] 转成 Set<Integer>。为了更简短写,可以直接利用 stream 的 distinct 和 count 计算
class Solution { public boolean containsDuplicate(int[] nums) { return IntStream.of(nums).distinct().count() != nums.length; } }
执行用时击败 50.85%,内存消耗击败 5.05%
类型题:
287. 寻找重复数(注意限定条件和上题不同!)