题目链接: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
解题思路:
我的比较麻烦,真就在那傻傻模拟,嗨呀
class Solution {
/**
* @param Integer[] $nums1
* @param Integer[] $nums2
* @return Integer
*/
function numTriplets($nums1, $nums2) {
$n1 = count($nums1); $n2 = count($nums2);
$a1 = array(); $a2 = array();
$ans = 0;
sort($nums1); sort($nums2);
for($i = 0; $i < $n1; $i++) {
if(!isset($a1[$nums1[$i]])) {
$a1[$nums1[$i]] = 1;
} else {
$a1[$nums1[$i]]++;
}
}
for($i = 0; $i < $n2; $i++) {
if(!isset($a2[$nums2[$i]])) {
$a2[$nums2[$i]] = 1;
} else {
$a2[$nums2[$i]]++;
}
}
for($i = 0; $i < $n1; $i++) {
for($j = 0; $j < $n2; $j++) {
if($nums2[$j] > $nums1[$i]) {
break;
}
if($nums1[$i] * $nums1[$i] % $nums2[$j] == 0) {
if($nums1[$i] == $nums2[$j]) {
if(isset($a2[$nums2[$j]]) && $a2[$nums2[$j]] > 1){
$ans = $ans+($a2[$nums2[$j]]*($a2[$nums2[$j]]-1))/2;
break;
}
}
elseif(isset($a2[$nums1[$i]*$nums1[$i]/$nums2[$j]])) {
$ans = $ans + $a2[$nums1[$i]*$nums1[$i]/$nums2[$j]];
}
}
}
}
for($i = 0; $i < $n2; $i++) {
for($j = 0; $j < $n1; $j++) {
if($nums1[$j] > $nums2[$i]) {
break;
}
if($nums2[$i] * $nums2[$i] % $nums1[$j] == 0) {
if($nums2[$i] == $nums1[$j]) {
if(isset($a1[$nums1[$j]]) && $a1[$nums1[$j]] > 1) {
$ans = $ans+($a1[$nums1[$j]]*($a1[$nums1[$j]]-1))/2;
break;
}
}
elseif(isset($a1[$nums2[$i]*$nums2[$i]/$nums1[$j]])) {
$ans = $ans + $a1[$nums2[$i]*$nums2[$i]/$nums1[$j]];
}
}
}
}
return $ans;
}
}