【发布时间】:2020-01-05 16:07:24
【问题描述】:
我解决了提供的以下 Codilty 问题。
一个整数 M 和一个由 N 个非负数组成的非空数组 A 给出整数。数组 A 中的所有整数都小于或等于 M.
一对整数 (P, Q),使得 0 ≤ P ≤ Q
例如,考虑整数 M = 6 和数组 A,这样:
A[0] = 3 A[1] = 4 A[2] = 5 A[3] = 5 A[4] = 2 There are exactly nine distinct slices: (0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2), (3, 3), (3, 4) and (4, 4).目标是计算不同切片的数量。
写一个函数:
类解决方案 { public int solution(int M, int[] A); }
给定一个整数 M 和一个由 N 组成的非空数组 A 整数,返回不同切片的数量。
如果不同切片的数量大于 1,000,000,000,则 函数应该返回 1,000,000,000。
例如,给定整数 M = 6 和数组 A,这样:
A[0] = 3 A[1] = 4 A[2] = 5 A[3] = 5 A[4] = 2 the function should return 9, as explained above.为以下假设编写一个有效的算法:
N 是 [1..100,000] 范围内的整数; M是一个整数 范围 [0..100,000];数组 A 的每个元素都是一个整数 范围 [0..M]。
我的解决方案在这里,
public static int solution(int M, int[] A) {
boolean[] visited = new boolean[M + 1];
int N = A.length;
int result = 0;
for (int i = 0; i < N; i++) {
int k = i;
int count = 0;
while (i < N && !visited[A[i]]) {
count++;
visited[A[i]] = true;
i++;
}
i -=1;
// 3, 4, 5, 5, 2, 5, 4
int j = i;
while (j >= k && visited[A[j]]) {
visited[A[j]] = false;
j--;
}
result += count * (count + 1) / 2;
}
return result;
}
但是,在线评委估计的正确性和性能较低。我该如何改进?
【问题讨论】: