【发布时间】:2020-07-13 11:28:32
【问题描述】:
获取许多可能的不同子数组,使得它们最多包含给定数量的奇数。
示例:
arr = [2,1,2,1,3]
m = 2.
答案:
10
说明:
- 具有 0 个奇数的不同子数组 = [2]
- 具有 1 个奇数的不同子数组 = [2,1]、[1]、[2,1,2]、[1,2] 和 [3]
- 具有 2 个奇数的不同子数组 = [2,1,2,1], [1,2,1], [2,1,3], [1,3]
所以总共有 10 个可能的不同子数组。
约束:
数组大小最多可以有1000个元素,m的范围可以从1到数组大小。
public static int process(List<Integer> arr, int m) {
Set<String> set = new LinkedHashSet<>();
for (int i = 0; i < arr.size(); i++) {
for (int j = i; j < arr.size(); j++) {
int odd = 0;
StringBuilder sb = new StringBuilder();
for (int k1 = i; k1 <= j; k1++) {
if (arr.get(k1) % 2 != 0) {
odd++;
}
sb.append(arr.get(k1) + " ");
}
if (odd <= m) {
set.add(sb.toString());
}
}
}
return set.size();
}
该程序适用于小输入,但由于我有 3 个 for 循环,因此对于大输入会失败。解决这个程序的正确方法是什么?
我已经浏览过这篇文章 - find number of subarrays with specified number of odd integers,但这里的问题并未考虑关于 distinct 子数组的问题。
【问题讨论】: