开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
题目描述
给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k ,请你返回满足 0 <= i < j < n ,nums[i] == nums[j] 且 (i * j) 能被 k 整除的数对 (i, j) 的 数目 。
来源:力扣(LeetCode)
- 示例 1
输入:nums = [3,1,2,2,2,1,3], k = 2
输出:4
解释:
总共有 4 对数符合所有要求:
- nums[0] == nums[6] 且 0 * 6 == 0 ,能被 2 整除。
- nums[2] == nums[3] 且 2 * 3 == 6 ,能被 2 整除。
- nums[2] == nums[4] 且 2 * 4 == 8 ,能被 2 整除。
- nums[3] == nums[4] 且 3 * 4 == 12 ,能被 2 整除。
- 示例 1
输入: nums = [1,2,3,4], k = 1
输出: 0
解释: 由于数组中没有重复数值,所以没有数对 (i,j) 符合所有要求。
提示:
1 <= nums.length <= 1001 <= nums[i], k <= 100
思路分析
根据题意可知,题目给出一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k;需要在这个数组nums中找出出现频率两次以上的元素,计算该元素前一次出现的下标和后一次出现的下标之积,两数之积若是能被k整除,那么就算一个,计算出这样的元素有几对。
这道题目相对来说是挺简单的一道题目,暴力循环加按规则计算即可得出结果。声明一个变量total储存数目,两次for循环这个数组,外层循环需要从下标0开始循环,内层循环就需要从外层循环的后一个开始,然后对比一下nums[i]和nums[j],下标i和下标j的乘积是否能被k整除,若是都满足,那么total就累加1。等循环结束total就是我们要的结果。
AC代码
function solution(nums, k) {
let total = 0;
for(let i=0; i<nums.length; i++) {
for(let j=i+1; j<nums.length; j++) {
if(nums[i] == nums[j] && i * j % k == 0) {
total+=1;
}
}
}
console.log(total);
}
let nums = [3,1,2,2,2,1,3], k = 2
solution(nums, k);