递增三元组 蓝桥杯模拟赛java

探讨一种算法,用于确定数列中可能作为递增三元组中心的元素数量,通过遍历和比较实现解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递增三元组
问题描述
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],
则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
  给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
输入格式
  输入的第一行包含一个整数 n。
  第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
5
1 2 5 3 5
样例输出
2
样例说明
  a[2] 和 a[4] 可能是三元组的中心。
评测用例规模与约定
  对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
  对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class llq1{
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
	    int a[]=new int[n];
	    Set ss=new HashSet();
	    for(int i=0;i<n;i++) {
	    	a[i]=s.nextInt();
	    }
	    for(int i=0;i<=a.length-3;i++) {
	    	for(int j=1;j<=a.length-2;j++) {
	    		for(int k=2;k<=a.length-1;k++) {
	    			if(a[i]<a[j]&&a[j]<a[k]) {
	    			ss.add(a[j]);
	    			break;
	    			}
	    		}
	    	}
	    }
	    System.out.println(ss.size());
	}
}

set集合去重,依旧没有测试环境==

### 递增三元组问题的 Java 解法 在蓝桥杯竞赛中,**递增三元组问题**是一个典型的数据结构与算法应用题。题目要求统计满足 `A[i] < B[j] < C[k]` 的三元组数量,其中 `1 ≤ i, j, k ≤ N`,并且 `A`、`B`、`C` 是三个长度均为 `N` 的整数数组。该问题的关键在于避免暴力枚举,以提高程序运行效率。 #### 优化思路 一个高效的解法是利用**排序**和**双指针**策略。具体步骤如下: 1. **对数组 A、B、C 分别进行排序**。排序后可以利用数组的有序性减少重复比较。 2. **遍历数组 B**,对于每个 `B[j]`,统计数组 A 中小于 `B[j]` 的元素个数,以及数组 C 中大于 `B[j]` 的元素个数。 3. **使用双指针技巧**,在排序后的数组 A 和 C 中分别查找满足条件的元素数量。 4. 将每个 `B[j]` 对应的三元组数量累加,得到最终结果。 #### 示例代码 ```java import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] a = new int[n]; int[] b = new int[n]; int[] c = new int[n]; for (int i = 0; i < n; i++) { a[i] = sc.nextInt(); } for (int i = 0; i < n; i++) { b[i] = sc.nextInt(); } for (int i = 0; i < n; i++) { c[i] = sc.nextInt(); } Arrays.sort(a); Arrays.sort(b); Arrays.sort(c); long ans = 0; for (int j = 0; j < n; j++) { int countA = 0, countC = 0; int i = 0; while (i < n && a[i] < b[j]) { countA++; i++; } i = 0; while (i < n && c[i] > b[j]) { countC++; i++; } ans += 1L * countA * countC; } System.out.println(ans); } } ``` #### 时间复杂度分析 - 排序时间复杂度为 $ O(N \log N) $,适用于 `Arrays.sort()` 的排序算法。 - 遍历数组 B 并统计满足条件的元素数量,时间复杂度为 $ O(N) $。 - 整体时间复杂度为 $ O(N \log N) $,远优于暴力解法的 $ O(N^3) $。 #### 优化策略 - **排序优化**:通过排序将数组的无序性转化为有序性,便于后续的双指针或二分查找操作。 - **双指针策略**:利用双指针快速统计满足条件的元素数量,避免重复遍历。 - **空间优化**:不使用额外数据结构存储中间结果,直接在排序后的数组中进行统计[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值