列表

详情


100323. 优质数对的总数 I

给你两个整数数组 nums1nums2,长度分别为 nm。同时给你一个正整数 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)

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) { } };

javascript 解法, 执行用时: 79 ms, 内存消耗: 52.1 MB, 提交时间: 2024-10-10 09:26:31

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @param {number} k
 * @return {number}
 */
var numberOfPairs = function(nums1, nums2, k) {
    const cnt = new Map();
    for (let x of nums1) {
        if (x % k) {
            continue;
        }
        x /= k;
        for (let d = 1; d * d <= x; d++) { // 枚举因子
            if (x % d) {
                continue;
            }
            cnt.set(d, (cnt.get(d) || 0) + 1); // 统计因子
            if (d * d < x) {
                cnt.set(x / d, (cnt.get(x / d) ?? 0) + 1); // 因子总是成对出现
            }
        }
    }

    let ans = 0;
    for (const x of nums2) {
        ans += cnt.get(x) ?? 0;
    }
    return ans;
};

// 枚举倍数
const numberOfPairs2 = function(nums1, nums2, k) {
    const cnt1 = new Map();
    let u = 0;
    for (const x of nums1) {
        if (x % k === 0) {
            u = Math.max(u, x / k);
            cnt1.set(x / k, (cnt1.get(x / k) ?? 0) + 1);
        }
    }
    if (u === 0) {
        return 0;
    }

    const cnt2 = new Map();
    for (const x of nums2) {
        cnt2.set(x, (cnt2.get(x) ?? 0) + 1);
    }

    let ans = 0;
    for (const [x, cnt] of cnt2.entries()) {
        let s = 0;
        for (let y = x; y <= u; y += x) { // 枚举 x 的倍数
            s += cnt1.get(y) ?? 0;
        }
        ans += s * cnt;
    }
    return ans;
}

rust 解法, 执行用时: 4 ms, 内存消耗: 2.1 MB, 提交时间: 2024-10-10 09:25:43

use std::collections::HashMap;

impl Solution {
    // 枚举因子
    pub fn number_of_pairs(nums1: Vec<i32>, nums2: Vec<i32>, k: i32) -> i64 {
        let mut cnt = HashMap::new();
        for mut x in nums1 {
            if x % k != 0 {
                continue;
            }
            x /= k;
            let mut d = 1;
            while d * d <= x {
                if x % d == 0 {
                    *cnt.entry(d).or_insert(0) += 1;
                    if d * d < x {
                        *cnt.entry(x / d).or_insert(0) += 1;
                    }
                }
                d += 1;
            }
        }

        nums2.iter().map(|x| *cnt.get(x).unwrap_or(&0) as i64).sum()
    }

    // 枚举倍数
    pub fn number_of_pairs2(nums1: Vec<i32>, nums2: Vec<i32>, k: i32) -> i64 {
        let mut cnt1 = HashMap::new();
        for x in nums1 {
            if x % k == 0 {
                *cnt1.entry(x / k).or_insert(0) += 1;
            }
        }
        if cnt1.is_empty() {
            return 0;
        }

        let mut cnt2 = HashMap::new();
        for x in nums2 {
            *cnt2.entry(x).or_insert(0) += 1;
        }

        let mut ans = 0i64;
        let u = *cnt1.keys().max().unwrap();
        for (x, cnt) in cnt2 {
            let mut s = 0;
            for y in (x..=u).step_by(x as usize) { // 枚举 x 的倍数
                if let Some(&c) = cnt1.get(&y) {
                    s += c;
                }
            }
            ans += s as i64 * cnt as i64;
        }
        ans
    }
}

python3 解法, 执行用时: 39 ms, 内存消耗: 16.5 MB, 提交时间: 2024-05-26 19:01:07

class Solution:
    def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:
        cnt1 = Counter(x // k for x in nums1 if x % k == 0)
        if not cnt1:
            return 0
        ans = 0
        u = max(cnt1)
        for i, c in Counter(nums2).items():
            s = sum(cnt1[j] for j in range(i, u + 1, i))
            ans += s * c
        return ans
        
    # 统计因子
    def numberOfPairs2(self, nums1: List[int], nums2: List[int], k: int) -> int:
        cnt = defaultdict(int)
        for x in nums1:
            if x % k:
                continue
            x //= k
            for d in range(1, isqrt(x) + 1):
                if x % d:
                    continue
                cnt[d] += 1
                if d * d < x:
                    cnt[x // d] += 1
        return sum(cnt[x] for x in nums2)

golang 解法, 执行用时: 0 ms, 内存消耗: 2.9 MB, 提交时间: 2024-05-26 19:00:06

func numberOfPairs(nums1, nums2 []int, k int) (ans int) {
	cnt := map[int]int{}
	for _, x := range nums1 {
		if x%k > 0 {
			continue
		}
		x /= k
		for d := 1; d*d <= x; d++ {
			if x%d == 0 {
				cnt[d]++
				if d*d < x {
					cnt[x/d]++
				}
			}
		}
	}

	for _, x := range nums2 {
		ans += cnt[x]
	}
	return
}

func numberOfPairs2(nums1, nums2 []int, k int) (ans int) {
	cnt1 := map[int]int{}
	for _, x := range nums1 {
		if x%k == 0 {
			cnt1[x/k]++
		}
	}
	cnt2 := map[int]int{}
	for _, x := range nums2 {
		cnt2[x]++
	}

	m := slices.Max(nums1) / k
	for i, c := range cnt2 {
		s := 0
		for j := i; j <= m; j += i {
			s += cnt1[j]
		}
		ans += s * c
	}
	return
}

cpp 解法, 执行用时: 11 ms, 内存消耗: 41.9 MB, 提交时间: 2024-05-26 18:58:21

class Solution {
public:
    // 枚举倍数
    int numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        unordered_map<int, int> cnt1;
        for (int x : nums1) {
            if (x % k == 0) {
                cnt1[x / k]++;
            }
        }
        if (cnt1.empty()) {
            return 0;
        }
        unordered_map<int, int> cnt2;
        for (int x : nums2) {
            cnt2[x]++;
        }

        int ans = 0;
        int u = ranges::max_element(cnt1)->first;
        for (auto& [i, c] : cnt2) {
            int s = 0;
            for (int j = i; j <= u; j += i) {
                s += cnt1.contains(j) ? cnt1[j] : 0;
            }
            ans += s * c;
        }
        return ans;
    }

    // 统计因子
    int numberOfPairs2(vector<int>& nums1, vector<int>& nums2, int k) {
        unordered_map<int, int> cnt;
        for (int x : nums1) {
            if (x % k) {
                continue;
            }
            x /= k;
            for (int d = 1; d * d <= x; d++) {
                if (x % d) {
                    continue;
                }
                cnt[d]++;
                if (d * d < x) {
                    cnt[x / d]++;
                }
            }
        }

        int ans = 0;
        for (int x : nums2) {
            ans += cnt.contains(x) ? cnt[x] : 0;
        }
        return ans;
    }
};

java 解法, 执行用时: 2 ms, 内存消耗: 42.1 MB, 提交时间: 2024-05-26 18:55:33

class Solution {
    // 统计因子
    public int numberOfPairs(int[] nums1, int[] nums2, int k) {
        Map<Integer, Integer> cnt = new HashMap<>();
        for (int x : nums1) {
            if (x % k != 0) {
                continue;
            }
            x /= k;
            for (int d = 1; d * d <= x; d++) {
                if (x % d > 0) {
                    continue;
                }
                cnt.merge(d, 1, Integer::sum);
                if (d * d < x) {
                    cnt.merge(x / d, 1, Integer::sum);
                }
            }
        }

        int ans = 0;
        for (int x : nums2) {
            ans += cnt.getOrDefault(x, 0);
        }
        return ans;
    }

    // 枚举倍数
    public int numberOfPairs2(int[] nums1, int[] nums2, int k) {
        Map<Integer, Integer> cnt1 = new HashMap<>();
        for (int x : nums1) {
            if (x % k == 0) {
                cnt1.merge(x / k, 1, Integer::sum);
            }
        }
        if (cnt1.isEmpty()) {
            return 0;
        }

        Map<Integer, Integer> cnt2 = new HashMap<>();
        for (int x : nums2) {
            cnt2.merge(x, 1, Integer::sum);
        }

        int ans = 0;
        int u = Collections.max(cnt1.keySet());
        for (Map.Entry<Integer, Integer> e : cnt2.entrySet()) {
            int s = 0;
            int i = e.getKey();
            for (int j = i; j <= u; j += i) {
                if (cnt1.containsKey(j)) {
                    s += cnt1.get(j);
                }
            }
            ans += s * e.getValue();
        }
        return ans;
    }
}

上一题