题目是百度笔试转换后的问题。
1.解法一,暴力只能解决73%,时间复杂度o(n^2);
import java.util.*;
public class Main {
public static void main(String []args) {
int[] arr = {0,1,0,0,1,1,0,0};
int k = 2;
System.out.println(getResult(arr,k)); // 11
}
public static int getResult(int[] arr, int k) {
int count = 0;
int n = arr.length;
for (int i = 0; i < n; i++) {
int one = 0;
for (int j = i; j < n; j++) {
if (arr[j] == 1) {
one++;
}
if (one == k) {
count++;
}
}
}
return count;
}
}
2.优化解法,时间复杂度为o(n)
import java.util.*;
public class HelloWorld {
public static void main(String []args) {
int[] arr = {0,1,0,0,1,1,0,0};
int k = 2;
System.out.println(getResult(arr,k));
}
public static int getResult(int[] arr, int k) {
// 区间数
int count = 0;
int n = arr.length;
int zero = 0;
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
if (arr[i] == 0) {
zero++;
}
if (arr[i] == 1) {
list.add(zero);
zero = 0;
}
}
list.add(zero);
// 列表是两个1之间的0的数量
for (int i = 0; i < list.size() - k; i++) {
count += (list.get(i) + 1) * (list.get(i + k) + 1);
}
return count;
}
}