Take an element.
Count amount divisors it has.
Non-divisors = N - amount_of_divisors
import static java.lang.Integer.max;
import java.util.Arrays;
class Solution {
public int[] solution(int[] A) {
final int N = A.length;
final int MAX_VALUE_TBL = 2*50000;
int[] r = new int[N]; // result table
int[] AS_AV = new int[MAX_VALUE_TBL + 1]; // number of cell with values
int[] AS_AR = new int[MAX_VALUE_TBL + 1]; // results yet counted for values
boolean[] b = new boolean[MAX_VALUE_TBL + 1]; // if value has been counted
if (N == 1) return r;
for (int i = 0; i < N; i++) {
int v = A[i];
AS_AV[v]++;
}
for (int i = 0; i < N; i++) {
int cu_val = A[i];
if (!b[cu_val]) {
int am_div = getAmDivisors(cu_val, AS_AV);
int am_all = N;
r[i] = am_all - am_div;
b[cu_val] = true;
AS_AR[cu_val] = r[i];
} else {
r[i] = AS_AR[cu_val];
}
}
return r;
}
private int getAmDivisors(int cu_val, int[] AS_AV) {
int r = 0;
int sqr = (int) Math.sqrt(cu_val);
for (int divisor = sqr; divisor > 0; divisor--) {
if (cu_val % divisor == 0) {
r += AS_AV[divisor];
if (divisor * divisor != cu_val) {
r += AS_AV[cu_val / divisor];
}
}
}
return r;
}
}
Brak komentarzy:
Prześlij komentarz