哈希表题目:数的平方等于两数乘积的方法数

Posted 伟大的车尔尼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希表题目:数的平方等于两数乘积的方法数相关的知识,希望对你有一定的参考价值。

文章目录

题目

标题和出处

标题:数的平方等于两数乘积的方法数

出处:1577. 数的平方等于两数乘积的方法数

难度

5 级

题目描述

要求

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

  • 类型 1 \\texttt1 1:三元组 (i,   j,   k) \\texttt(i, j, k) (i, j, k),如果 nums1[i] 2 = nums2[j] × nums2[k] \\textttnums1[i]^\\texttt2 = \\textttnums2[j] \\times \\textttnums2[k] nums1[i]2=nums2[j]×nums2[k],其中 0 ≤ i < nums1.length \\texttt0 \\le \\texttti < \\textttnums1.length 0i<nums1.length 0 ≤ j < k < nums2.length \\texttt0 \\le \\textttj < \\textttk < \\textttnums2.length 0j<k<nums2.length
  • 类型 2 \\texttt2 2:三元组 (i,   j,   k) \\texttt(i, j, k) (i, j, k),如果 nums2[i] 2 = nums1[j] × nums1[k] \\textttnums2[i]^\\texttt2 = \\textttnums1[j] \\times \\textttnums1[k] nums2[i]2=nums1[j]×nums1[k],其中 0 ≤ i < nums2.length \\texttt0 \\le \\texttti < \\textttnums2.length 0i<nums2.length 0 ≤ j < k < nums1.length \\texttt0 \\le \\textttj < \\textttk < \\textttnums1.length 0j<k<nums1.length

示例

示例 1:

输入: nums1   =   [7,4],   nums2   =   [5,2,8,9] \\textttnums1 = [7,4], nums2 = [5,2,8,9] nums1 = [7,4], nums2 = [5,2,8,9]
输出: 1 \\texttt1 1
解释:类型 1 \\texttt1 1 (1,1,2) \\texttt(1,1,2) (1,1,2) nums1[1] 2 = nums2[1] × nums2[2] \\textttnums1[1]^\\texttt2 = \\textttnums2[1] \\times \\textttnums2[2] nums1[1]2=nums2[1]×nums2[2] 4 2 = 2 × 8 \\texttt4^\\texttt2 = \\texttt2 \\times \\texttt8 42=2×8)。

示例 2:

输入: nums1   =   [1,1],   nums2   =   [1,1,1] \\textttnums1 = [1,1], nums2 = [1,1,1] nums1 = [1,1], nums2 = [1,1,1]
输出: 9 \\texttt9 9
解释:所有三元组都符合题目要求,因为 1 2 = 1 × 1 \\texttt1^\\texttt2 = \\texttt1 \\times \\texttt1 12=1×1
类型 1 \\texttt1 1 (0,0,1) \\texttt(0,0,1) (0,0,1) (0,0,2) \\texttt(0,0,2) (0,0,2) (0,1,2) \\texttt(0,1,2) (0,1,2) (1,0,1) \\texttt(1,0,1) (1,0,1) (1,0,2) \\texttt(1,0,2) (1,0,2) (1,1,2) \\texttt(1,1,2) (1,1,2) nums1[i] 2 = nums2[j] × nums2[k] \\textttnums1[i]^\\texttt2 = \\textttnums2[j] \\times \\textttnums2[k] nums1[i]2=nums2[j]×nums2[k]
类型 2 \\texttt2 2 (0,0,1) \\texttt(0,0,1) (0,0,1) (1,0,1) \\texttt(1,0,1) (1,0,1) (2,0,1) \\texttt(2,0,1) (2,0,1) nums2[i] 2 = nums1[j] × nums1[k] \\textttnums2[i]^\\texttt2 = \\textttnums1[j] \\times \\textttnums1[k] nums2[i]2=nums1[j]×nums1[k]

示例 3:

输入: nums1   =   [7,7,8,3],   nums2   =   [1,2,9,7] \\textttnums1 = [7,7,8,3], nums2 = [1,2,9,7] nums1 = [7,7,8,3], nums2 = [1,2,9,7]
输出: 2 \\texttt2 2
解释:有两个符合题目要求的三元组。
类型 1 \\texttt1 1 (3,0,2) \\texttt(3,0,2) (3,0,2) nums1[3] 2 = nums2[0] × nums2[2] \\textttnums1[3]^\\texttt2 = \\textttnums2[0] \\times \\textttnums2[2] nums1[3]2=nums2[0]×nums2[2]
类型 2 \\texttt2 2 (3,0,1) \\texttt(3,0,1) (3,0,1) nums2[3] 2 = nums1[0] × nums1[1] \\textttnums2[3]^\\texttt2 = \\textttnums1[0] \\times \\textttnums1[1] nums2[3]2=nums1[0]×nums1[1]

示例 4:

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

数据范围

  • 1 ≤ nums1.length,   nums2.length ≤ 1000 \\texttt1 \\le \\textttnums1.length, nums2.length \\le \\texttt1000 1nums1.length, nums2.length1000
  • 1 ≤ nums1[i],   nums2[i] ≤ 10 5 \\texttt1 \\le \\textttnums1[i], nums2[i] \\le \\texttt10^\\texttt5 1nums1[i], nums2[i]105

解法

思路和算法

( i , j , k ) (i, j, k) (i,j,k) 表示符合题目要求的三元组。

如果 ( i , j , k ) (i, j, k) (i,j,k) 是类型 1 1 1 的三元组,则令 x = nums 1 [ i ] x = \\textitnums_1[i] x=nums1[i] y = nums 2 [ j ] y = \\textitnums_2[j] y=nums2[j] z = nums 2 [ k ] z = \\textitnums_2[k] z=nums2[k],有 x 2 = y × z x^2 = y \\times z x2=y×z。如果 ( i , j , k ) (i, j, k) (i,j,k) 是类型 2 2 2 的三元组,则令 x = nums 2 [ i ] x = \\textitnums_2[i] x=nums2[i] y = nums 1 [ j ] y = \\textitnums_1[j] y=nums1[j] z = nums 1 [ k ] z = \\textitnums_1[k] z=nums1[k],有 x 2 = y × z x^2 = y \\times z x2=y×z

为了计算符合题目要求的三元组的数目,需要分别计算类型 1 1 1 和类型 2 2 2 的三元组的数目。假设数组 nums 1 \\textitnums_1 nums1 nums 2 \\textitnums_2 nums2 的长度分别是 m m m n n n。如果暴力统计符合题目要求的三元组,则统计类型 1 1 1 的三元组需要 O ( m n 2 ) O(mn^2) O(mn2) 的时间,统计类型 2 2 2 的三元组需要 O ( n m 2 ) O(nm^2) O(nm2) 的时间,总时间复杂度是 O ( m n ( m + n ) ) O(mn(m + n)) O(mn(m+n)),会超出时间限制,因此需要优化。

暴力方法的时间复杂度过高是因为相同的元素被重复计算。为了降低时间复杂度,应该避免重复计算。可以使用哈希表记录数组中的元素和每个元素的出现次数。

首先遍历数组 nums 1 \\textitnums_1 nums1 nums 2

两数的平方和

题目描述:判断一个给定的数是否为两个数的平方和。

题目分析:使用双指针,一个数从1开始,一个数从给定数的算术平方根开始。较小的数每次累加1,较大的数每次减1。

  • 如果两个数的平方和 sum == target,那么得到要求的结果;
  • 如果 sum > target,移动较大的元素,使 sum 变小一些;
  • 如果 sum < target,移动较小的元素,使 sum 变大一些。

代码如下:

public class DoublePointer {
    public static void main(String[] args){
        print(judgeSquareSum(5));
    }

    public static int[] judgeSquareSum(int c) {
        int i = 0, j = (int) Math.sqrt(c);
        while (i <= j) {
            int powSum = i * i + j * j;
            if (powSum == c) {
                return new int[]{i, j};
            } else if (powSum > c) {
                j--;
            } else {
                i++;
            }
        }
        return null;
    }

    public static void print(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++){
            if (i!=arr.length-1){
                System.out.print(arr[i] + ",");
            }else{
                System.out.print(arr[i]);
            }

        }
        System.out.print("]");
    }
}

执行结果:[1,2]

以上是关于哈希表题目:数的平方等于两数乘积的方法数的主要内容,如果未能解决你的问题,请参考以下文章

两数之和再进化--大餐计数(哈希表的利用)

454哈希表-四数相加

哈希表的查找与插入及删除

哈希表问题

两数之和(哈希解法)

GEEK编程练习— —两数求和