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