首页 > 其他分享 >[LeetCode] 1497. Check If Array Pairs Are Divisible by k

[LeetCode] 1497. Check If Array Pairs Are Divisible by k

时间:2024-10-02 09:05:07浏览次数:7  
标签:map Pairs temp Divisible arr int 整除 true LeetCode

Given an array of integers arr of even length n and an integer k.

We want to divide the array into exactly n / 2 pairs such that the sum of each pair is divisible by k.

Return true If you can find a way to do that or false otherwise.

Example 1:
Input: arr = [1,2,3,4,5,10,6,7,8,9], k = 5
Output: true
Explanation: Pairs are (1,9),(2,8),(3,7),(4,6) and (5,10).

Example 2:
Input: arr = [1,2,3,4,5,6], k = 7
Output: true
Explanation: Pairs are (1,6),(2,5) and(3,4).

Example 3:
Input: arr = [1,2,3,4,5,6], k = 10
Output: false
Explanation: You can try all possible pairs to see that there is no way to divide arr into 3 pairs each with sum divisible by 10.

Constraints:
arr.length == n
1 <= n <= 105
n is even.
-109 <= arr[i] <= 109
1 <= k <= 105

检查数组对是否可以被 k 整除。

给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。

现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。

如果存在这样的分法,请返回 true ;否则,返回 false。

思路

如何判断某两个数字 a + b 的和是否可以被 k 整除?这里分两种情况

  • a 和 b 各自都能被 k 整除,那么 a + b 也应该可以被 k 整除。比如 a = 9, b = 6, k = 3, a + b = 15, 15 % 3 = 0
  • a 和 b 不能同时被 k 整除,但是 a % k + b % k 可以被 k 整除。比如 a = 8, b = 1, k = 9, a % k + b % k = 8 + 1 = 9 % 9 = 0

上面的推论不难得到。这道题还有第二个需要注意的点就是 input 里是有负数的。即使有负数我们也无需担心,上面提到的模运算的结合律还是成立的。这里可以手动算一下就知道。

具体做法是这里我们需要处理一下 input 数组里的每一个数字,因为他们有正有负,这里我把他们统统处理成比 k 小的正数,然后我们找与其配对的数字的时候就会比较容易了。

复杂度

时间O(n)
空间O(n)

代码

Java实现

class Solution {
    public boolean canArrange(int[] arr, int k) {
        int n = arr.length;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int temp = arr[i] % k;
            if (temp < 0) {
                temp += k;
            }
            map.put(temp, map.getOrDefault(temp, 0) + 1);
        }

        for (Integer key : map.keySet()) {
            if (key != 0) {
                int x = map.get(key);
                int y = map.getOrDefault(k - key, 0);
                if (x != y) {
                    return false;
                }
            } else if (map.get(0) % 2 != 0) {
                return false;
            }
        }
        return true;
    }
}

标签:map,Pairs,temp,Divisible,arr,int,整除,true,LeetCode
From: https://www.cnblogs.com/cnoodle/p/18444374

相关文章

  • leetcode24 两两交换链表中的节点(swap-nodes-in-pairs)
    题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] 提示:链表中节点的数......
  • Leetcode 1193 每月交易(探究当有关联字段有NULL值如何做左右关联
    题目现有一个交易表Transactions,内有id,country,state(列类型为["approved","declined"]),amount金额,trans_date交易日期。编写一个sql查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。以 任意顺序 返回结果表。数据准备CreatetableIfN......
  • Leetcode 1907 按分类统计薪水
    一、题目查询每个工资类别的银行账户数量。 工资类别如下:"LowSalary":所有工资 严格低于 20000 美元。"AverageSalary": 包含 范围内的所有工资 [$20000, $50000] 。"HighSalary":所有工资 严格大于 50000 美元。结果表 必须 包含所有三个类别。 如果某个类......
  • leetcode刷题day34|动态规划Part03 背包问题(01背包问题 二维、01背包问题 一维、416.
    0-1背包问题二维动规五部曲1、确定dp数组以及下标的含义dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。(取物品时可以是取0-i的任意一个,或者是他们的组合)2、确定递推公式不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i-1][j]......
  • leetcode刷题day33|动态规划Part02(62.不同路径、63. 不同路径 II、 343.整数拆分、96.
    62.不同路径机器人从(0,0)位置出发,到(m-1,n-1)终点。动规五部曲1、确定dp数组(dptable)以及下标的含义dp[i][j]:表示从(0,0)出发,到(i,j)有dp[i][j]条不同的路径。2、确定递推公式想要求dp[i][j],只能有两个方向来推导出来,即dp[i-1][j]和dp[i][j-1]。dp[i]......
  • Leetcode 611. 有效三角形的个数
    1.题目基本信息1.1.题目描述给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数。1.2.题目地址https://leetcode.cn/problems/valid-triangle-number/description/2.解题方法2.1.解题思路升序排列后,去两条边a和b,取b后面的第三条边c;a+c>b和b+c>a一......
  • 力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树
    之前发过一篇,感觉还有深挖的地方,于是又补充一些信息这题目虽然是middle难度题目,要解答出来是只要easy的时间,但是深挖可以有hard的难度题解1可以帮助复习线段树的使用,题解2可以复习一下java基础知识题解1线段树这是自己憋出来的线段树classSeatManager{......
  • 【LeetCode Hot 100】23. 合并K个升序链表
    题目描述看到这个题目会想起之前做过的合并2个升序链表。在那个题目中,由于两个链表都已经是升序的,可以将两个链表的元素进行逐个比较并添加到答案链表中。但是在本题中,每次循环都需要在k个链表的当前元素中找出最小的,而且需要在所有k个链表都遍历完之后跳出循环,所以效率比较低。......
  • Leetcode 875. 爱吃香蕉的珂珂
    1.题目基本信息1.1.题目描述珂珂喜欢吃香蕉。这里有n堆香蕉,第i堆中有piles[i]根香蕉。警卫已经离开了,将在h小时后回来。珂珂可以决定她吃香蕉的速度k(单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉k根。如果这堆香蕉少于k根,她将吃掉这堆的所有香蕉,然后......
  • Leetcode:栈和队列的互相实现
    目录一、用两个队列实现栈题目:分析:代码实现: 二、用两个栈实现队列题目: 分析:代码:总结:核心就在于先进先出和后进先出之间的一个灵活变换,两个栈能够先进先出,而两个队列能够后进先出 一、用两个队列实现栈题目:.-力扣(LeetCode).-备战技术面试?力扣提供海量技术......