package weekContest.A399.A3; import java.util.ArrayList; import java.util.HashMap; /** * @see 100321. 优质数对的总数 II * @ProjectName: LeetCode * @FileName: Solution * @Author: 杨逸 * @Data:2024/5/26 10:26 * @Description: * 给你两个整数数组 nums1 和 nums2,长度分别为 n 和 m。同时给你一个正整数 k。 * * 如果 nums1[i] 可以被 nums2[j] * k 整除,则称数对 (i, j) 为 优质数对(0 <= i <= n - 1, 0 <= j <= m - 1)。 * * 返回 优质数对 的总数。 * * * * 示例 1: * * 输入:nums1 = [1,3,4], nums2 = [1,3,4], k = 1 * * 输出:5 * * 解释: * * 5个优质数对分别是 (0, 0), (1, 0), (1, 1), (2, 0), 和 (2, 2)。 * * 示例 2: * * 输入:nums1 = [1,2,4,12], nums2 = [2,4], k = 3 * * 输出:2 * * 解释: * * 2个优质数对分别是 (3, 0) 和 (3, 1)。 * * * * 提示: * * 1 <= n, m <= 105 * 1 <= nums1[i], nums2[j] <= 106 * 1 <= k <= 103 */ public class Solution { public long numberOfPairs(int[] nums1, int[] nums2, int k) { //同时能整除k和nums[j],才能整除k*nums[j] long result = 0; HashMap map1 = new HashMap<>(); HashMap map2 = new HashMap<>(); HashMap map3 = new HashMap<>(); //筛选能整除k的nums[i] ArrayList list = new ArrayList<>(); for (int v : nums1) { if (v%k==0)list.add(v); } for (Integer v : list) { map1.put(v, map1.getOrDefault(v, 0) + 1); } for (int v : nums2) { v = v*k; //map2.put(v, map2.getOrDefault(v, 0) + 1); if (v%2!=0){ //奇数 map2.put(v, map2.getOrDefault(v, 0) + 1); }else { //偶数 map3.put(v, map3.getOrDefault(v, 0) + 1); } } for (Integer v1 : map1.keySet()) { //for (Integer v2 : map2.keySet()) { // if (v1%v2==0)result+=(map1.get(v1)*map2.get(v2)); //} if (v1%2!=0){ //奇数 for (Integer v2 : map2.keySet()) { if (v1%v2==0)result+=(map1.get(v1)*map2.get(v2)); } //特殊的5和1 if (v1%5==0){ for (Integer v2 : map3.keySet()) { if (v1%v2==0)result+=(map1.get(v1)*map3.get(v2)); } } }else { //偶数 for (Integer v2 : map3.keySet()) { if (v1%v2==0)result+=(map1.get(v1)*map3.get(v2)); } //特殊的1 Integer aDefault = map2.getOrDefault(1, 0); if (aDefault !=0){ for (Integer integer : map1.keySet()) { if (integer%2==0)result+=aDefault*map1.get(integer); } } } } return result; } }