leetcode 1497.检查数组对是否可以被k整除

原题

1797.检查数组对是否可以被k整除
2020年6月28日
195周赛第二题
在这里插入图片描述

题解

方法一

对于k来说,余数一共有k种,分别是0到k-1,那么我们不妨建立一个数组长度为k,数组中的每个元素的下标就代表余数,元素的值代表有多少数mod k后得这个余数。遍历一遍原数组得到余数数组的每一项值。
遍历完数组,先看yushu[0]的值是否偶数;再看一下互补的余数的数量是否相等,如果k是偶数,那么还要看一下余数为k/2的数量是否为偶数。不过既然题目说了n为偶数,那么就可以少判断0或者k/2之一了。
本思路java代码示例:

/*
@v7fgg
执行用时:8 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:48.2 MB, 在所有 Java 提交中击败了100.00%的用户
2020年6月28日 14:02
*/
class Solution {
    public boolean canArrange(int[] arr, int k) {
        int yushu[]=new int[k];
        for(int i=0;i<arr.length;i++){
            int a=arr[i]%k<0?arr[i]%k+k:arr[i]%k;
            yushu[a]++;
        }
        if(yushu[0]%2==1){return false;}
        if(k%2==0){
            if(yushu[k/2]%2==1){return false;}
            for(int i=1;i<k/2;i++){
                if(yushu[i]!=yushu[k-i]){return false;}
            }
        }
        else{
            for(int i=1;i<=k/2;i++){
                if(yushu[i]!=yushu[k-i]){return false;}
            }
        }
        return true;
    }
}

方法二

思路与方法一相同,只是用来HashMap来存储某余数对应的数字个数。
本思路java代码示例:

/*hashmapde value的比较要用.equals
@v7fgg
执行用时:51 ms, 在所有 Java 提交中击败了23.37%的用户
内存消耗:56.5 MB, 在所有 Java 提交中击败了100.00%的用户
2020年7月2日 14:29
*/
class Solution {
    public boolean canArrange(int[] arr, int k) {
        Map<Integer,Integer> m=new HashMap<>();
        for(int i=0;i<arr.length;i++){
            m.put((arr[i]%k+k)%k,m.getOrDefault((arr[i]%k+k)%k,0)+1);
        }
        if(m.containsKey(0)&&m.get(0)%2!=0){return false;}
        if(k%2==0){
            if(m.containsKey(k/2)&&m.get(k/2)%2==1){return false;}
            for(int i=1;i<k;i++){
                if(m.containsKey(i)){
                    if(m.containsKey(k-i)){
                        if(!m.get(i).equals(m.get(k-i))){return false;}
                    }
                    else{return false;}
                }
            }
        }
        else{
            for(int i=1;i<k;i++){
                if(m.containsKey(i)){
                    if(m.containsKey(k-i)){
                        if(!m.get(i).equals(m.get(k-i))){return false;}
                    }
                    else{return false;}
                }
            }
        }
        return true;
    }
}

注意在Integer里面的范围是[-128,127]
方法二参考资料1
方法二参考资料2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可爱抱抱呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值