LeetCode1207独一无二的出现次数

题目描述

  给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。

解析

  正常的解法肯定是对每个元素使用一个hashmap,存元素及出现次数,然后通过set去查找是否有重复,但是在上一题(2215)的基础上,可以通过面向输入编程,依旧是创建数组然后对应位置加加,这样操作后再用set去查找。

int[] times = new int[2001];
        for(int n : arr){
            times[n + 1000] ++;
        }
        Set<Integer> seen = new HashSet<>();
        for (int num : times) {
            if (num != 0 && !seen.add(num)) {
                return false;
            }
        }
        return true;

在这里插入图片描述
  实际上还可以优化,得到每个元素的次数后,可以遍历这个数组,将出现次数再次映射到一个bool数组中(最多出现1000次),需要注意的是要将0除去,同时某个元素找完了就不用要再判断了。

public boolean uniqueOccurrences(int[] arr) {
        int[] map = new int[2001];
        for (int x : arr) {
            map[x + 1000] ++;
        }
        boolean[] count = new boolean[1001];
        for (int x : arr) {
            int num = map[x + 1000];
            map[x + 1000] = 0;
            if (num != 0 && count[num]) {
                return false;
            }
            count[num] = true;
        }
        return true;
    }

在这里插入图片描述

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值