前言:
各位同学大家好,现在这段时间给大家更新算法的一些讲解 废话不多说我们正式开始,希望能帮助到各位的学习 工作以及面试
需求
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
示例
输入:nums = [1,2,3,1]
输出:true
具体实现
第一种 排序
在对数字从小到大排序之后,数组的重复元素一定出现在相邻位置中。因此,我们可以扫描已排序的数组,每次判断相邻的两个元素是否相等,如果相等则说明存在重复的元素。
public static 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;
}
复杂度分析
时间复杂度:O(N\log N)O(NlogN),其中 NN 为数组的长度。需要对数组进行排序。
空间复杂度:O(\log N)O(logN),其中 NN 为数组的长度。注意我们在这里应当考虑递归调用栈的深度。
我们通过 for循环 数组里面的相邻的2个元素进行数值对比 如果相等我们返回true 否则就返回false
测试一把
image.png方法二
对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。
public static boolean containsDuplicate2(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for (int x : nums) {
if (!set.add(x)) {
return true;
}
}
return false;
}
第二种我们用这个HashSet集合
-
HashSet 就是一个 HashMap。HashMap的key存放值,value存放Object对象
-
HashSet 特点是不重复,也正是利用了HashMap的数据结构的特点,它key是不会重复的。如果不理解先看上面的HashMap知识
所以我们for循环便利的时候将原来数组里面每一个元素添加到我们set里面如果出现重复的元素就会返回false
测试效果 :
## 完整代码
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/***
*
* 创建人:xuqing
* 创建时间:2022年6月20日16:47:01
* 类说明:测试类
*
*
*/
public class onenums {
public static void main(String[] args) {
int[] numbers={1,2,3,1};
Boolean flag=containsDuplicate(numbers);
Boolean flag2=containsDuplicate2(numbers);
System.out.println("方法1");
System.out.println(flag);
System.out.println("方法2");
System.out.println(flag2);
}
public static 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;
}
public static boolean containsDuplicate2(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for (int x : nums) {
if (!set.add(x)) {
return true;
}
}
return false;
}
}
最后总结
以后会长期更新算法文章讲解的,主要是希望能帮助到各位网友的基础学习和面试的 最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里
网友评论