LeetCode 217.存在重复元素

目录

题目:

题目描述:

题目链接:

思路:

思路一详解(排序):

思路二详解(Set):

思路三详解(Map):

代码:

Java思路一(排序)代码:

Java思路二(Set)代码:

Java思路三(Map)代码:


题目:

题目描述:

题目链接:

217. 存在重复元素 - 力扣(LeetCode)

思路:

思路一详解(排序):

先对整数数组进行排序,遍历排序后数组的每一位,再判断该位是否等于后一位。只要找到某一位等于后一位就说明任一值在数组至少出现两次,无需后续判断直接return true;即可。如果整个数组元素全部遍历完都不存在某一位等于后一位,返回false(索引结束条件为i<nums.length-1,防止数组越界)

思路二详解(Set):

遍历整个数组把每个数字放到Set中,Set具有去重的特性。每次放入数字时调用contains判断Set中是否存在该数字,如果已经存在就说明任一值在数组中出现至少两次,直接返回true。如果成功把数组的全部数组都放入Set中,就说明数组中不存在重复的元素,返回false

思路三详解(Map):

这题完全没必要用到Map,效率非常低,但是我还是提出这个思路也相当于是引入后续题目的思路,同时自己作为Java小白熟悉一下语法

Map里面存的是键值对,这题键存的是数组中的元素值,值存的是数组中这个元素出现的次数。遍历整个数组把每个数字存入键中,调用containsKey判断Map中的键是否存在这个数字,如果存在就调用get获取到这个键对应的值(即出现次数)+1再把调用put把键值对再存回Map中。如果不存在,就说明这个数字第一次出现,那么把键值对的值设为1再存回Map中。

最后利用键值对的方式遍历Map集合,用count记录每个键值对的值,判断count是否>=2,如果是则return true;如果不是则return false;

代码:

Java思路一(排序)代码:

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

Java思路二(Set)代码:

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int i=0;i<nums.length;i++)
        {
            if(set.contains(nums[i]))
            {
                return true;
            }
            set.add(nums[i]);
        }
        return false;
    }
}

Java思路三(Map)代码:

class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashMap<Integer,Integer> hm = new HashMap<>();
        for(int i=0;i<nums.length;i++)
        {
            if(hm.containsKey(nums[i]))
            {
                int count=hm.get(nums[i]);
                count++;
                hm.put(nums[i],count);
            }
            else
            {
                hm.put(nums[i],1);
            }
        }
        Set<Map.Entry<Integer,Integer>> entries = hm.entrySet();
        for (Map.Entry<Integer, Integer> entry : entries) {
            int count = entry.getValue();
            if (count >= 2) {
                return true;
            }
        }
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值