题源:leetcode;
Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.
翻译:给定一个数组,判断数组有无重复元素,有重复元素返回true,没有返回false
算法过程记录
自己想的
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;
}
参考答案
public boolean containsDuplicate(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
for (int i = 0; i < n - 1; i++) {
if (nums[i] == nums[i + 1]) return true;
}
return false;
}
算法分析
网站上提供了两种算法,一种时条用内部的排序加一层循环判断,另一种是使用hash来解决这个问题。
我写的算法在网站显示的时间长度过长。
给的两个算法,一个时用了内置的排序,表示很受伤。
复杂度分析
时间复杂度:O(N\log N)O(NlogN),其中 N 为数组的长度。需要对数组进行排序。
空间复杂度:O(\log N)O(logN),其中 N 为数组的长度。注意我们在这里应当考虑递归调用栈的深度。
hash算法处理本题是我没想到的
public boolean containsDplicate(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for (int x : nums) {
if (!set.add(x)) {
return true;
}
}
return false;
}
-
时间复杂度:O(N)O(N),其中 NN 为数组的长度。
-
空间复杂度:O(N)O(N),其中 NN 为数组的长度。
总的来说都是使用了,Java的内置的数据类型来实现该功能,是对Java内置的数据类型内容的记忆理解与使用。
本题从分析的结果看都时hash更优
Set
HashSet
Array