算法小知识-----04.22-----存在重复数组

69 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

今天是周五,上线了一版做了许久的区块链溯源工程,还是颇为满意的,至少稳定运行没有bug

存在重复数组

该题出自力扣的217题 —— 存在重复数组【简单题】,我愿称这题是我最快做完的

审题

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

输入: nums = [1,2,3,1]
输出: true
  • 题意没什么好说的,相当简单,给出一个整型数组,如果数组内有值出现次数超过两次,则返回true,如果数组内每一个元素都互不相同,则返回false;
  • 判断数组内每个元素都不相同,很麻烦;但是判断数组内是否存在一个数超过两次则相对很简单
  • 解法很多,虽然是简单题,反而更需要举一反三
    • 解法一: 利用额外的空间去存储数组,并且借助空间返回
      • 利用Set去实现,Set具有元素唯一的特性
      • 如果Set.add方法返回false,则表示已经加入过一次了,可以直接返回true
      • 遍历到最后直接返回false
    • 解法二:利用Arrays.sort方法
      • 利用sort方法对数组进行排序
      • 并且遍历数组,如果数组的前一位数据与下一位数组相同,则可以直接返回true
      • 遍历到最后直接返回false
    • 解法三:利用数量侧面对比
      • 直接对数组进行stream.distinct.count方法,也就是查重后获取数量
      • 如果最终数量 != 数组原数量,则代表有重复数据,返回true
      • 反之返回fasle

编码

  • 利用Set数据结构实现
class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        for (int x : nums) {
            if (!set.add(x)) {
                return true;
            }
        }
        return false;
    }
}
  • 利用Arrays.sort
    public boolean containsDuplicate(int[] name){
        Arrays.sort(name);
        int n = nums.length;
        for(int i =0;i<n-1;i++){
            if(nums[i] == nums[i+1])return true;
        }
        return false;
    }
class Solution {
    public boolean containsDuplicate(int[] nums) {
        return Arrays.stream(nums).distinct().count() < nums.length?true:false;
    }
}

image.png