初级算法——存在重复元素

场景:

刷力扣题,今天做的是一道简单题,我笑得像一个孩子一样


问题描述:

给定一个整数数组,判断是否存在重复元素。

如果存在一值在数组中出现至少两次,函数返回 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

解法一:

暴力破解
嵌套循环比较两个值,如果相等则直接返回true,否则返回false;
缺点:超时间,时间复杂度O(n^2)


	 public static 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;
	}

解法二:

Hashmap
利用hasmap的key不可重复的特点记录数组的元素,value记录数组元素出现的次数,再遍历map,如果有value为2或者以上的直接返回true,否则返回false


 public static boolean containsDuplicate2(int[] nums) {
		 HashMap<Integer,Integer> map= new HashMap<Integer,Integer>();
		 for(int i=0;i<nums.length;i++) {
			 if(!map.containsKey(nums[i])) {
				 map.put(nums[i],1);
			 }else {
				 map.put(nums[i], 1+map.get(nums[i]));
			 }
		 }
		 for(Integer key:map.keySet()) {
			 if(map.get(key)>=2) return true;
		 }
		 return false;
	 }
缺点效率很低,运行效果:
	执行结果:
	通过
	显示详情
	执行用时:11 ms, 在所有 Java 提交中击败了6.10% 的用户
	内存消耗:44.8 MB, 在所有 Java 提交中击败了17.10% 的用户

解法三:

排序,在去比较相邻两值是否相等

 public static boolean containsDuplicate3(int[] nums) {
		Arrays.sort(nums);
		for(int i=0;i<nums.length-1;i++) {
			if(nums[i]==nums[i+1]) {
				return true;
			}
		}
		return false;
	 }
执行结果:
		通过
		显示详情
		执行用时:3 ms, 在所有 Java 提交中击败了99.70% 的用户
		内存消耗:41.3 MB, 在所有 Java 提交中击败了95.99% 的用户

解法四:

set
遍历数组,数字放到 set 中。如果数字已经存在于 set 中,直接返回 true。如果成功遍历完数组,则表示没有重复元素,返回 false。


 public static boolean containsDuplicate4(int[] nums) {
		 HashSet set=new HashSet();
		 for(Integer i:nums) {
			 if(set.contains(i)) {
				 return true;
			 }
			 set.add(i);
		 }
		 return false;
	 }

执行结果:

	通过
	显示详情
	执行用时:7 ms, 在所有 Java 提交中击败了36.21% 的用户
	内存消耗:42.5 MB, 在所有 Java 提交中击败了50.18% 的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

关于我成为程序员这档事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值