一、题目描述
如果一个数组中出现次数最多的元素出现大于等于k次,被称为k-优雅数组
,k也可以被称为优雅阈值
。
例如,数组[1, 2, 3, 1, 2, 3, 1]
,它是一个3-优雅数组
,因为元素1
出现次数大于等于3次,数组[1, 2, 3, 1, 2]
就不是一个3-优雅数组
,因为其中出现次数最多的元素时1
和2
,只出现了2次。
给定一个数组A和k,请求出A有多少子数组是k-优雅子数组
。
子数组是数组中一个或多个连续元素组成的数组。
例如,数组[1, 2, 3, 4]
包含10个子数组,分别是:[1]
,[1, 2]
,[1, 2, 3]
,[1, 2, 3, 4]
,[2]
,[2, 3]
,[2, 3, 4]
,[3]
,[3, 4]
,[4]
。
二、输入描述
第一行输入两个整数n和k,n是数组A的长度,k是优雅阈值。
第二行输入n个整数,表示给定的数组A。
1 <= n <= 10000, 1 <= k <= n
数组A中的元素A[i]满足:1 <= A[i] <= n
三、输出描述
数据一个整数,表示数组A中k-优雅子数组
的数量
行尾不要有多余空格
四、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr2 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 数组A的长度
int n = arr2[0];
// 优雅阈值
int k = arr2[1];
// 给定的数组A
int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int ret = 0;
for (int i = 0; i < n; i++) {
Map<Integer, Integer> count = new HashMap<Integer, Integer>();
for (int j = i; j < n; j++) {
Integer key = arr[j];
count.put(key, count.getOrDefault(key, 0) + 1);
if (count.get(key) >= k) {
ret += n - j;
break;
}
}
}
System.out.println(ret);
}
五、效果展示
1、输入
7 2
1 2 3 1 2 3 1
2、输出
10
3、说明
10个优雅子数组分别是(下标从0计数):
长度为4:1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1
长度为5:1, 2, 3, 1, 2, 2, 3, 1, 2, 3, 3, 1, 2, 3, 1
长度为6:1, 2, 3, 1, 2, 3, 2, 3, 1, 2, 3, 1
长度为7:1, 2, 3, 1, 2, 3, 1
🏆下一篇:华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。