classSolution { public: intbrokenCalc(int X, int Y){ if (X == Y) return0; if (X > Y) return X - Y; if (Y % 2 == 1) returnbrokenCalc(X, Y + 1) + 1; elsereturnbrokenCalc(X, Y / 2) + 1; } };
992. Subarrays with K Different Integers
最后留给最后一道题的时间是40min,争取把这道Hard题目解决。
思路:根据问题的时间复杂度O(n ^ 2)(我们至少需要遍历一遍所有的subarray)可知,解法的时间复杂度至少为O(n^2)。
用2层循环遍历所有的subarray, 如何快速地求出每个subarray的distinct number呢。
可以使用动态规划来缩减复杂度。
用每个子数组的distinct number, 我们用hashmap<int, int>存储,key表示distict number, value 表示该数的频数。
设f(i, j)为子数组[i, j]的distinct number对应的hashmap,
则f(i, j) =
f(i, j-1).insert(A[j])
or
f(i+1, j).delete(A[i])
new(A[i]), if i == j.
自底而上的构造hashmap的话,外层循环 new, 内层循环 delete。
结果TLE了。
想想有没有O(n log n)的解法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: intsubarraysWithKDistinct(vector<int>& A, int K){ unordered_set<int> frequency; // 如果没有delete的操作,使用unordered_set也是可以的 int result = 0; for (int i = 0; i < A.size(); i++) { for (int j = i; j < A.size(); j++) { if (i == j) { frequency.clear(); } frequency.insert(A[j]); if (K == frequency.size()) result++; if (K < frequency.size()) break; } } return result; } };