北邮机试 三元组 暴力枚举+优化
🍑 算法题解专栏
🍑 Acwing 3543 三元组
输入
2
2
0 0
5
1 1 1 2 1
输出
8
16
🍑 纯暴力版 O(n^3)
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while (T-- > 0)
{
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++)
a[i] = sc.nextInt();
long res = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
if (a[i] + a[j] == a[k])
res++;
System.out.println(res);
}
}
}
🍑 优化版 O(n^2)
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while (T-- > 0)
{
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++)
a[i] = sc.nextInt();
long res = 0;
HashMap<Integer, Integer> map = new HashMap<>();//hash map 存第三个数的值
for (int i = 0; i < n; i++)//枚举第一个数
{
map.put(a[i] + a[i], map.getOrDefault(a[i] + a[i], 0) + 1);//下标相同只算一种情况
for (int j = i + 1; j < n; j++)//枚举第二个数
{
int k = a[i] + a[j];//k 是计算出来的第三个数
map.put(k, map.getOrDefault(k, 0) + 2);//i j 同就可以交换位置,算两种情况
}
}
for (int i = 0; i < n; i++)//遍历所有数,找出以这个数为结果的 两个因子 的方案数
res += map.getOrDefault(a[i], 0);
System.out.println(res);
}
}
}