北邮机试 三元组 暴力枚举+优化

🍑 算法题解专栏


🍑 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);
		}
	}
}
posted @ 2023-04-23 21:51  兑生  阅读(10)  评论(0编辑  收藏  举报  来源
Live2D