2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一个正整数 k。 如果 nums1 数组中的元素 nums1[i] 能被
2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一个正整数 k。
如果 nums1 数组中的元素 nums1[i] 能被 nums2 数组中的元素 nums2[j] 乘以 k 除尽,则称 (i, j) 为一个优质数对(其中 0 <= i <= n - 1,0 <= j <= m - 1)。
请计算并返回所有优质数对的数量。
1 <= n, m <= 50。
1 <= nums1[i], nums2[j] <= 50。
1 <= k <= 50。
输入:nums1 = [1,3,4], nums2 = [1,3,4], k = 1。
输出:5。
解释:
5个优质数对分别是 (0, 0), (1, 0), (1, 1), (2, 0), 和 (2, 2)。
答案2025-01-01:
题目来自leetcode3162。
大体步骤如下:
1.创建两个空的 map 数据结构 count 和 count2 来分别记录 nums1 和 nums2 中出现的数字及其出现次数。
2.初始化变量 max1 为 0,用于记录 nums1 中的最大值。
3.遍历 nums1 数组,对 count 中相应数字的出现次数进行统计,同时更新 max1 的值为 nums1 中的最大数字。
4.遍历 nums2 数组,对 count2 中相应数字的出现次数进行统计。
5.初始化变量 res 为 0,用于记录符合条件的优质数对数量。
6.遍历 count2 中的数字 a 及其出现次数 cnt,然后从 ak 开始到 max1,每次以 ak 增加的步长遍历 b。
7.在遍历过程中,若 count 中存在 b 这个数字,则将 count[b] 和 count2[a] 的乘积加到 res 中。
8.返回最终的 res 值作为优质数对的总数。
总的时间复杂度:
假设 nums1 的长度为 n,nums2 的长度为 m,k 的值为常数,代码中的主要循环是两个 for 循环,第一个 for 循环是遍历 count2 中的元素,第二个 for 循环是根据 k 和 a 的值计算另一个数组中的元素并检查是否存在。因此,总的时间复杂度为 O(n*m)。
总的额外空间复杂度:
在代码中使用了两个 map 数据结构 count 和 count2 用于存储数字及其出现次数,再加上少量的变量空间,因此总的额外空间复杂度为 O(n + m)。
Go完整代码如下:
package main
import (
"fmt"
)
func numberOfPairs(nums1 []int, nums2 []int, k int) int64 {
count := make(map[int]int)
count2 := make(map[int]int)
max1 := 0
for _, num := range nums1 {
count[num]++
if num > max1 {
max1 = num
}
}
for _, num := range nums2 {
count2[num]++
}
var res int64
for a, cnt := range count2 {
for b := a * k; b <= max1; b += a * k {
if _, ok := count[b]; ok {
res += int64(count[b] * cnt)
}
}
}
return res
}
func main() {
nums1 := []int{1, 3, 4}
nums2 := []int{1, 3, 4}
k := 1
result := numberOfPairs(nums1, nums2, k)
fmt.Println(result)
}

Rust完整代码如下:
use std::collections::HashMap;
fn number_of_pairs(nums1: Vec<i32>, nums2: Vec<i32>, k: i32) -> i64 {
let mut count = HashMap::new();
let mut count2 = HashMap::new();
let mut max1 = 0;
for &num in &nums1 {
*count.entry(num).or_insert(0) += 1;
if num > max1 {
max1 = num;
}
}
for &num in &nums2 {
*count2.entry(num).or_insert(0) += 1;
}
let mut res: i64 = 0;
for (&a, &cnt) in &count2 {
let mut b = a * k;
while b <= max1 {
if let Some(&count_b) = count.get(&b) {
res += count_b as i64 * cnt as i64;
}
b += a * k;
}
}
res
}
fn main() {
let nums1 = vec![1, 3, 4];
let nums2 = vec![1, 3, 4];
let k = 1;
let result = number_of_pairs(nums1, nums2, k);
println!("{}", result);
}

2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一个正整数 k。 如果 nums1 数组中的元素 nums1[i] 能被的更多相关文章
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数. Google2009华南地 ...
- 随机获取一个集合(List, Set)中的元素,随机获取一个Map中的key或value
利用Java提供的Random类.从List或Set中随机取出一个元素,从Map中随机获取一个key或value. 因为Set没有提供get(int index)方法,仅仅能先获取一个随机数后.利用一 ...
- /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数
/** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...
- 洛谷 P1064 金明的预算方案【DP/01背包-方案数】
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...
- (二)u-boot2013.01.01 for TQ210:《Makefile分析》
当时写的时候看的是2012-10版本的,但是略对比了一遍和2013.01.01没什么改动,所以这不影响对2013.01.01版本的makefile的理解.本文比较侧重于语法句意的分析,框 ...
- c#---部分;把数组或者结构体存入集合里,然后再从集合中取出之后,输出;foreach既可以用到提取数组重点额数据,也可以提取集合中的数据(前提是集合中的元素是相同数据类型)
1.输入班级人数,统计每个人的姓名,性别,年龄:集合与数组 //Console.Write("请输入班级人数:"); //int a = int.Parse(Console.Rea ...
- (五)u-boot2013.01.01 for TQ210:《移植前的准备及u-boot初编译》
移植前的准备 移植前,要做的事情是搭建开发环境以及对U-boot源码的获取.首先说一下开发环境: 1.此次U-boot移植的硬件平台是天嵌的TQ210开发板: CPU:板载核心是S5PV210(Cor ...
- 有两个数组a,b,大小都为n,;通过交换a,b中的元素,使sum(a)-sum(b)最小。
有两个数组a,b,大小都为n,数组元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小. 当前数组a和数组b的和之差为 A = sum(a) - ...
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组
题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...
- K:找寻数组中第n大的数组元素的三个算法
相关介绍: 给定一个数组,找出该数组中第n大的元素的值.其中,1<=n<=length.例如,给定一个数组A={2,3,6,5,7,9,8,1,4},当n=1时,返回9.解决该问题的算法 ...
随机推荐
- CentOS8安装RabbitMQ3.8.16
之前安装过旧版的RabbitMQ和Erlang,先卸载. ①:卸载RabbitMQ /sbin/service rabbitmq-server stop yum list | grep rabbitm ...
- 怎样在Windows 环境下安装Git附详细步骤图
Git下载路径:https://git-scm.com/ [步骤] 在非C盘创建一个git_install作为git的安装目录,双击安装包,按下一步默认安装即可 (后面有时间来补充各个参数意思,目前按 ...
- Next.js 深度教程:服务端渲染、静态生成到增量静态再生 | 2024最新版
优化字体和图像 书接上回,我们学习了如何设计Next.js应用程序,让我们继续优化主页和添加自定义字体.图像. 在网站设计中,字体扮演着关键角色,然而,若需获取并加载字体文件,项目中引入自定义字体可能 ...
- Unity6 URP17使用初探
1.简介 随着Unity6的发布,URP17也已经可以上手使用,相对旧的版本改动较大的是加入了 RenderGraph.STP.Foveated rendering.GPU Resident Draw ...
- 去除tinymce中粘贴的样式
import "tinymce/plugins/paste"; tinymce.init({ ...其他配置, plugins: ["paste"], past ...
- JS之Class类
转载:https://juejin.cn/post/7098891689955164168 ECMAScript 6 提供了更接近传统语言的写法,新引入的class关键字具有正式定义类的能力.类(cl ...
- vue3-setup中使用响应式
基本类型的响应式数据 在 Vue 3 中,ref是一个函数,用于创建响应式的数据.它主要用于处理基本类型(如数字.字符串.布尔值等)的数据响应式 当我们调用 ref 函数时,会返回一个包含一个 .va ...
- Winform解决跨线程更新UI的问题
最近又拿起了Winform的程序,由于要起socket server,所以需要起线程,这里就遇到了经典的跨线程UI调用的问题. 如果什么都不写,直接由线程更新UI,会报错:线程间操作无效. 这里的解决 ...
- 【分块】LibreOJ 6282 数列分块入门6
题目 https://loj.ac/p/6282 题解 数据范围 \(1 \leq n \leq 10^5\),因此进行分块最多分 \(\sqrt{10^5} ≈ 318\) 块.且数据是随机生成的, ...
- 【杂谈】服务端能同时处理多少个 Socket 连接?背后的资源与限制分析
一个服务端进程能同时连接多少个 Socket? 要理解一个服务端进程能同时支持多少个连接,首先我们需要明确一个 socket 连接 的表示方式.一个连接由四个部分组成:[LocalIP:LocalPo ...