Hippogriff's Blog
首页
C++
  • 算法
  • 数据结构
  • Leetcode
  • 操作系统
  • 计算机网络
  • MySQL
  • 深度学习
  • 网络
收藏
  • 醍醐灌顶
  • 句读
个人书单 (opens new window)
GitHub (opens new window)

Absm

什么也不会
首页
C++
  • 算法
  • 数据结构
  • Leetcode
  • 操作系统
  • 计算机网络
  • MySQL
  • 深度学习
  • 网络
收藏
  • 醍醐灌顶
  • 句读
个人书单 (opens new window)
GitHub (opens new window)
  • 算法

  • 数据结构

  • Leetcode

    • 滑窗专题
    • 回文串专题
    • 剑指offer 07 重建二叉树
    • LCCUP 2021被虐
    • Leetcode 51 - N皇后
    • Leetcode 79 单词搜索
    • Leetcode 1577 数的平方等于两数乘积的方法数
      • 题目
      • 思路
      • 代码与结果
    • Leetcode 5602 将 x 减到 0 的最小操作数
    • Leetcode 第243场周赛
    • Leetcode 全排列小专题
  • 算法
  • Leetcode
Absm
2021-03-14
目录

Leetcode 1577 数的平方等于两数乘积的方法数

# Leetcode 1577 数的平方等于两数乘积的方法数

# 题目

给你两个整数数组 nums1 和 nums2 ,请你返回根据以下规则形成的三元组的数目(类型 1 和类型 2 ):

  • 类型 1:三元组 (i, j, k) ,如果$ nums1[i]2 == nums2[j] * nums2[k] 其中 0 <= i < nums1.length 且 0 <= j < k < nums2.length$
  • 类型 2:三元组 (i, j, k) ,如果 $nums2[i]2 == nums1[j] * nums1[k] 其中 0 <= i < nums2.length 且 0 <= j < k < nums1.length$

示例 1:

输入:nums1 = [7,4], nums2 = [5,2,8,9]
输出:1
解释:类型 1:(1,1,2), nums1[1]^2 = nums2[1] * nums2[2] (4^2 = 2 * 8)
1
2
3

示例 2:

输入:nums1 = [1,1], nums2 = [1,1,1]
输出:9
解释:所有三元组都符合题目要求,因为 1^2 = 1 * 1
类型 1:(0,0,1), (0,0,2), (0,1,2), (1,0,1), (1,0,2), (1,1,2), nums1[i]^2 = nums2[j] * nums2[k]
类型 2:(0,0,1), (1,0,1), (2,0,1), nums2[i]^2 = nums1[j] * nums1[k]
1
2
3
4
5

示例 3:

输入:nums1 = [7,7,8,3], nums2 = [1,2,9,7]
输出:2
解释:有两个符合题目要求的三元组
类型 1:(3,0,2), nums1[3]^2 = nums2[0] * nums2[2]
类型 2:(3,0,1), nums2[3]^2 = nums1[0] * nums1[1]
1
2
3
4
5

示例 4:

输入:nums1 = [4,7,9,11,23], nums2 = [3,5,1024,12,18]
输出:0
解释:不存在符合题目要求的三元组
1
2
3

提示:

1 <= nums1.length, nums2.length <= 1000
1 <= nums1[i], nums2[i] <= 10^5
1
2

# 思路

利用哈希表。

首先对第一个数组的每一个数取平方,然后插入到哈希表中,如果已经存在那么就在原来大小上+1.

然后遍历第二个数组,取两个数的乘积去哈希表里寻找,直接加上哈希表中的数值。

这个数值是有意义的,比如上面给出的示例2,

示例 2:

输入:nums1 = [1,1], nums2 = [1,1,1]
输出:9
解释:所有三元组都符合题目要求,因为 1^2 = 1 * 1
类型 1:(0,0,1), (0,0,2), (0,1,2), (1,0,1), (1,0,2), (1,1,2), nums1[i]^2 = nums2[j] * nums2[k]
类型 2:(0,0,1), (1,0,1), (2,0,1), nums2[i]^2 = nums1[j] * nums1[k]
1
2
3
4
5

nums1里只会得到两个结果是1的值,如果后面遍历后查找哈希表,会只得到“能找到这样的匹配”的结果。但是如果我们让数字有意义,存放nums1中平方得到该值的个数,那么后面遍历时能得到的就不仅仅是能找到这样的匹配了,而是“这样的匹配有n个”,把n加到结果上即可。

注意:

  • int相乘可能会超过int的范围,这时候要用long,而且要主动转换类型,否则int*int>int范围就会直接报错了。
  • 注意翻转两个数组的顺序再找一遍。

# 代码与结果

class Solution {
public:
    int numTriplets(vector<int>& nums1, vector<int>& nums2) {
        return hashAndFind(nums1,nums2) + hashAndFind(nums2,nums1);
    }
private:
    int hashAndFind(vector<int>& nums1, vector<int>& nums2){
        int res = 0;
        map<long, int> mp;
        for(auto& num : nums1){
            ++mp[(long)num*num];
        }
        int n = nums2.size();
        for(int i = 0; i< n-1; ++i){
            for(int j=i+1; j<n; ++j){
                res += mp[(long)nums2[i]*nums2[j]];
            }
        }
        return res;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

结果(大概是没啥人做这个题,所以排名靠前

编辑 (opens new window)
上次更新: 2023/03/02, 12:43:17
Leetcode 79 单词搜索
Leetcode 5602 将 x 减到 0 的最小操作数

← Leetcode 79 单词搜索 Leetcode 5602 将 x 减到 0 的最小操作数→

最近更新
01
少年游·长安古道马迟迟
11-30
02
CMake基础命令
11-08
03
由浅入深剖析OAuth2.0的授权码模式
07-07
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Murray Li | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×