leetcode——时间空间复杂度分析

探讨如何将一个偶数长度的整数数组分成恰好一半的对,要求每对数字之和能被k整除。该问题涉及数组处理和条件判断,是算法分析的一个实例。

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

见极客时间03

  1. 检查数组对是否可以被 k 整除
    给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。
    如果存在这样的分法,请返回 True ;否则,返回 False 。
时间复杂度:先遍历数组O(n),再遍历哈希表,哈希表中放对k取余的余数,共k个键(0~k-1)。
故O(n+k)
空间复杂度:哈希表 O(k)
func canArrange(arr []int, k int) bool {
//A:数组中原数字
//a:A对k取余后的结果,均转换为正数
//要想(A+B)%k = 0,得a+b = 0/k(要想两数之和整除k,两数对k求余之和必须等于k/0
//eg. (2+6)%2 = 0,得2%2 + 6%2 = 0
//eg. (2+5)%7 = 0,的2%7 + 5%7 = 7

//1.map键:对每个数求的余数    value:余数出现的次数
//2.两数对k求余之和等于k:
//对于余数1~k-1,其中每个余数i出现的次数,k-i出现的次数要能和相等匹配
//3.两数对k求余之和等于0:
//余数0出现的次数必须是偶数
    m := make(map[int]int)
    for _,v := range arr {
        mod := (v % k + k) % k //mod必须是正数
        m[mod]++
    }
    for key := range m {
        if key != 0 && m[key] != m[k-key] {
            return false   
        }else if  key == 0 &&  m[key] % 2 != 0 {
            return false
        }
    }
    return true
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值