存在重复元素-----(算法学习日记21.5.27)

本文探讨了如何解决整数数组中重复元素的检查问题。首先介绍了简单的双重循环方法,虽然能解决问题但效率低下。接着,通过排序数组来减少循环次数,将时间复杂度降低。最后,引入HashSet数据结构,利用其不存储重复元素的特性,只需一次遍历就能判断重复,这种方法在空间效率上有所牺牲但提高了时间效率。三种方法各有优劣,适用于不同场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

题目很简单,就只是查找是否存在重复元素,我浮现出的第一个思路就是二层循环,将一个元素与后面所有的元素进行比较值是否相同,思路很简单,代码如下:

class Solution {
    public boolean containsDuplicate(int[] nums) {
        int len = nums.length;
        int i = 0,j = 1;
        boolean symbol = false;//symbol用于标记是否有重复元素
        for(;i < len - 1; i++){
            for(j = i + 1; j < len; j++){
                if(nums[i] == nums[j]){
                    symbol = true;//有重复元素,标记为true同时跳出循环
                    break;
                }
            }
        }
        return symbol;
    }
}

思路很简单,也通过了测试,不过我们可以很显然地发现,由于使用了二层循环当数组长度过大时,就会超时,因此需要让循环层数降低,或者删除重复元素比较长度,由于我目前只掌握了Arrays.sort(),因此我选择降低循环层数,思路如下:

先用Arrays.sort()对数组进行排序,重复元素必定相邻,所以我们只需要比较相邻元素的值是否相同,从而减少了一层循环,代码如下:

import java.util.Arrays;
class Solution {
    public boolean containsDuplicate(int[] nums) {
        Arrays.sort(nums);//先给数组排序
        boolean symbol = false;//返回的布尔值默认为false
        int i = 0,j = 1;//定义两个指针用于查找元素
        for(;j<nums.length;i++,j++){
            if(nums[i]==nums[j]){
                symbol = true;//有重复元素的时候跳出循环并标记为true
                break;
            }
        }
        return  symbol;
    }
}

结果耗时:4ms 通过

还有一个比较长度的方法,我会在以后进行补充

21.5.28补充:

经过了解,我知道了Set集合有一个条件:传入的对象不能有重复值。那么我的思路就是把nums[]中的所有元素传到Set集合中,然后比较Set集合的长度,Set集合有两种实现:

1.HashSet         由哈希表支持,此类允许使用null元素,也不保证循序.

2.TreeSet          该类在遍历集合时可以按照自然顺序递增排序,也可以制定比较器递增排序。

在这里我们选用HashSet

所以首先我们需要创建一个Set集合

Set<Integer> id = HashSet<>();

然后只需要把元素传入就行,用遍历的方式传入

for(int a : nums){
    id.add(a);
}

最后比较nums长度与Set集合长度

if(id.size()!=nums.length) return true;

最后代码如下:

class Solution {
    public boolean containsDuplicate(int[] nums) {
       Set<Integer> num = new HashSet<>();
       for(int len : nums){
           num.add(len);
       }
       if(nums.length!=num.size()) return true;
       else return false;
    }
}

最后结果确实通过了,但是消耗时间长于前面的先排序在比较元素是否相等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值