哈希表题目:数的平方等于两数乘积的方法数
Posted 伟大的车尔尼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希表题目:数的平方等于两数乘积的方法数相关的知识,希望对你有一定的参考价值。
文章目录
题目
标题和出处
标题:数的平方等于两数乘积的方法数
难度
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 0≤i<nums1.length 且 0 ≤ j < k < nums2.length \\texttt0 \\le \\textttj < \\textttk < \\textttnums2.length 0≤j<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 0≤i<nums2.length 且 0 ≤ j < k < nums1.length \\texttt0 \\le \\textttj < \\textttk < \\textttnums1.length 0≤j<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 1≤nums1.length, nums2.length≤1000
- 1 ≤ nums1[i], nums2[i] ≤ 10 5 \\texttt1 \\le \\textttnums1[i], nums2[i] \\le \\texttt10^\\texttt5 1≤nums1[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]
以上是关于哈希表题目:数的平方等于两数乘积的方法数的主要内容,如果未能解决你的问题,请参考以下文章