Leetcode 2183. 统计可以被 K 整除的下标对数目

news/2024/11/15 1:29:58/文章来源:https://www.cnblogs.com/geek0070/p/18417031

1.题目基本信息

1.1.题目描述

给你一个下标从 0 开始、长度为 n 的整数数组 nums 和一个整数 k ,返回满足下述条件的下标对 (i, j) 的数目:

  • 0 <= i < j <= n - 1 且
  • nums[i] * nums[j] 能被 k 整除。

1.2.题目地址

https://leetcode.cn/problems/count-array-pairs-divisible-by-k/description

2.解题方法

2.1.解题思路

哈希表 + 辗转相除法求最大公约数

2.2.解题步骤

第一步,统计各个数字的最大公约数的频数

第二步,理论:两个数字的乘积能被k整除 <=> 两个数字各自与k的最大公约数的乘积能被k整除。循环两层遍历最大公约数,获取两两组合的频数乘积的和。在这里,对于合法的(i,j)对,会被枚举两次,(i,j)和(j,i)两对相同;同时对于不合法的(i,i)对,会被枚举一次

第三步,去掉多枚举的不合法的(i,i)对

第四步,result除以2,消除(i,j)和(j,i)重复对的影响,并返回结果

3.解题代码

Python代码

# 辗转相除法求最大公约数
def gcd(m,n):maxVal,minVal=max(m,n),min(m,n)r=maxVal%minValwhile r!=0:maxVal=minValminVal=rr=maxVal%minValreturn minValclass Solution:def countPairs(self, nums: List[int], k: int) -> int:# 第一步,统计各个数字的最大公约数的频数frep=Counter([gcd(num,k) for num in nums])# print(frep)# 第二步,理论:两个数字的乘积能被k整除 <=> 两个数字各自与k的最大公约数的乘积能被k整除。循环两层遍历最大公约数,获取两两组合的频数乘积的和。在这里,对于合法的(i,j)对,会被枚举两次,(i,j)和(j,i)两对相同;同时对于不合法的(i,i)对,会被枚举一次result=0for x in frep:for y in frep:if x*y%k==0:result+=frep[x]*frep[y]# 第三步,去掉多枚举的不合法的(i,i)对for key in frep.keys():if key*key%k==0:result-=frep[key]# 第四步,result除以2,消除(i,j)和(j,i)重复对的影响,并返回结果return result//2

C++代码

class Solution {
public:long long countPairs(vector<int>& nums, int k) {unordered_map<long long,long long> frep;for(long long num:nums){long long gcdVal=gcd(num,k);if(frep.find(gcdVal)==frep.end()){frep[gcdVal]=1;}else{frep[gcdVal]++;}}long long result=0;for(auto iter1:frep){for(auto iter2:frep){// cout << iter1.first << " " << iter2.second << endl;long long x=iter1.first,y=iter2.first;if(x*y%k==0){result+=frep[x]*frep[y];}}}for(auto iter3:frep){long long key=iter3.first;if(key*key%k==0){result-=frep[key];}}return result/2;}
};

4.执行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798562.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪心算法-找不重叠的区间段

1.说明 有N个区间片段,查找其中不重叠的片段最大个数。例如(6 8),(2 4),(3 5),(1 5),(5 9),(8 10)这6个片段中,不重叠的片段最大个数为3,分别为(2 4),(6 8),(8 10)。 2.解析 先按照起始位置从小到大进行排序,使用贪心算法使有效片段尽可能小,即结束位置更靠前…

Nuxt Kit 中的页面和路由管理

title: Nuxt Kit 中的页面和路由管理 date: 2024/9/17 updated: 2024/9/17 author: cmdragon excerpt: 摘要:本文介绍了Nuxt Kit中页面和路由管理的高级功能,包括extendPages自定义页面路由、extendRouteRules定义复杂路由逻辑及addRouteMiddleware注册路由中间件。通过这些…

堆的应用

1.需要具备的知识 1.1以顺序存储方式存储完全二叉树 完全二叉树:节点从上到下,从左到右布局的二叉树,如下图所示。完全二叉树可以使用类似数组这种顺序存储的结构存节点,如下图。按照"层级遍历"方式遍历这棵树(还有"前序、中序、后序"遍历方式,这里不做…

Oliver编译安装(Windows10+VisualStudio2022)

Oliver是一个开源的非线性视频编辑器。主要基于Qt和FFmpeg开发。前置条件 电脑上需要的环境Qt(>=5.15) VisualStudio(2022,其他版也可) vcpkg软件安装安装Qt5.15令人糟糕的是,Qt如今变得不太容易安装。自从Qt5.15以后的版本,就取消了离线安装。所有的Qt后序版本就只能通过…

CVE-2021-24762 复现

CVE-2021-24762 复现一看是个wordpress,看了下版本6.0没洞,直接扔wpscan扫一下 发现了个插件一搜发现perfect-survey在1.5.2之前都有洞,直接搜exp打. 上官网找了个API重扫一遍,直接给出了CVE号!直接找个sqlmap的exp跑一下,注意第二个位置选n来设置cookie sqlmap -u "http…

Java后端对前端的数据进行校验

首先,作为一名后端程序员,大家一定要记住:不要相信前端传来的数据,后端程序员仿佛是国家的边境出入局的工作人员,承担这最后的防线,必须尽可能的防止错误信息的流入导致正确信息的流出。因此,后端程序员必须要对前端传来的数据进行校验。这里呢,发现一个很好的校验工具…

vp介绍

想要更多请到:https://budingcat.xyz 注册了解详情 可以点击工单进行沟通哦~

云计算与大数据概论--金功勋

week4的 week5 Hadoop介绍起源:Hadoop as a solution:Building blocks:Namenodeif other nodes fail:DataNode:Block 1Secondary Namenode:JobTracker:if fails:Topolosy clusterPig:Hive :PIGweek10 week13:

通过vscode 创建uniapp项目

一、创建项目 uniapp官网教程: https://uniapp.dcloud.net.cn/quickstart-cli.html控制台命令: npx degit dcloudio/uni-preset-vue#vite <projectName> npm i二、使用vscode运行项目

Java多线程复习

目录3种创建方式(现阶段推荐 Runnable接口)下载网上的图片(利用了commons-io中的copyUrlToFiles方法)小结买票的例子(Thread的构造方法,获取当前线程的名称,线程休眠)龟兔赛跑的例子实现Callable接口线程停止线程休眠线程礼让Join方法(main线程与Thread子线程)线程状…

大数据技术原理与应用——从入门到文档数据库

大数据技术原理与应用 3次信息化的浪潮研究问题的四个阶段大数据技术的层次大数据的计算模式PaaS物联网的概念云计算、大数据、物联网之间的关系Hadoop应用现状选择Hdoop需要考虑的因素Hadoop的定量评分(满分为5分)总体评价Ubuntu的一些基本知识(之所以不用CentOs,是因为其…

macOS Ventura 13.7 (22H123) 正式版发布,ISO、IPSW、PKG 下载

macOS Ventura 13.7 (22H123) 正式版发布,ISO、IPSW、PKG 下载macOS Ventura 13.7 (22H123) 正式版发布,ISO、IPSW、PKG 下载 2024 年 9 月 17 日凌晨 1 点,Tim Cook 领导的 Apple 今天发布了 macOS 15 Sequoia 正式版,iPhone 镜像、密码应用程序、窗口平铺更新等带来全新体…