题目描述
给定一个正整数数组 a = { a 1 , a 2 , … , a n } \mathbf{a}=\{a_1,a_2,\ldots,a_n\} a={a1,a2,…,an},其长度为 n n n,数组里任意一个元素满足 1 ⩽ a i ⩽ n 1\leqslant a_i\leqslant n 1⩽ai⩽n。假设 t i t_i ti代表 i i i在 a \mathbf{a} a中出现的次数,求出 t = { t 1 , t 2 , … , t n } \mathbf{t}=\{t_1,t_2,\ldots,t_n\} t={t1,t2,…,tn}。时间复杂度要求 O ( n ) \mathcal{O}(n) O(n),空间复杂度要求 O ( 1 ) \mathcal{O}(1) O(1)。
我的思路
思路来源于二进制转换。构造和式 S = ∑ i = 1 n t i ⋅ ( n + 1 ) i − 1 S=\sum_{i=1}^n t_i\cdot (n+1)^{i-1} S=∑i=1nti⋅(n+1)i−1:
int sum = 0;
for (int i = 1; i <= n; ++i) {
sum += pow(n+1, a[i-1]-1);
}
for (int i = 1; i <= n; ++i) {
a[i-1] = sum % (n+1);
sum /= (n+1);
}
处理后a
就是数组
t
\mathbf{t}
t。但这种做法看起来就容易溢出,有没有更好的办法呢?