1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public int minimumKeypresses(String s) {
int[] charCount = new int[26];
char[] sArray = s.toCharArray();
for (char letter : sArray) {
charCount[letter - 'a'] += 1;
}
PriorityQueue<Integer> charCountPQ = new PriorityQueue<>((a, b) -> b - a);
for (int i = 0; i < 26; i++) {
if (charCount[i] != 0) {
charCountPQ.offer(charCount[i]);
}
}
int count = 0, press = 0, ans = 0;
while (!charCountPQ.isEmpty()) {
if (count % 9 == 0) {
press += 1;
}
int currFreq = charCountPQ.poll();
ans += press * currFreq;
count += 1;
}
return ans;
}
}

Greedy. 就是让出现频率最多的去占有每一个button的第一个位置. 因此从大到小排列, 分别去占每个button的第一个位置, 占满后占用第二个位置, 以此类推.

时间复杂度: O(N + 26log26 + 26) = O(N). 得到每个char的freq是O(n), 给PQ则最多26个元素, 因此是O(26log26). 把PQ的元素都poll出来, 一共最多26个. 因此合在一起是O(N).
空间复杂度: O(26 + 26) = O(1). 存freq是长度为26的数组. PQ最多存26个元素.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int minimumKeypresses(String s) {
Integer[] charCount = new Integer[26];
Arrays.fill(charCount, 0);
char[] sArray = s.toCharArray();
for (char letter : sArray) {
charCount[letter - 'a'] += 1;
}
Arrays.sort(charCount, (a, b) -> b - a);
int ans = 0;
for (int i = 0; i < 26; i++) {
ans += charCount[i] * ((i + 9) / 9);
}
return ans;
}
}

上面傻了, 我们只需要用个array存一下每一个char的freq即可. 由于普通int array无法倒序sort, 因此我们用个Integer[].

时间复杂度和空间复杂度不变.