自己的思路
使用 哈希法 ,将字符映射到数组的索引中,然后在遍历的时候记录最大值。
最后通过两个循环找到合适下标
第一个循环找到出现次数最大的值
第二个循环根据这个最大值找到下标。由于要找到按照字符排序大小输出了答案,所以需要逆序查找
时间复杂度 O(3N),空间复杂度 O(1)
class Solution { public char slowestKey(int[] releaseTimes, String keysPressed) { int[] map = new int[26]; Arrays.fill(map, 0); int index = keysPressed.charAt(0) - 'a'; map[index] = releaseTimes[0]; for (int i = 1; i < keysPressed.length(); i++) { index = keysPressed.charAt(i) - 'a'; map[index] = Math.max(map[index], releaseTimes[i] - releaseTimes[i - 1]); } int max = 0; int maxIndex = 0; for (int i = 0; i < map.length; i++) { if (max < map[i]) { max = map[i]; } } for (int i = map.length - 1; i >= 0; i--) { if (map[i] == max) { maxIndex = i; break; } } return (char)(maxIndex + 'a'); } }
哈希法 不一定非得用 Map 集合 ,能使用数组的就使用数组,因为数组本来就是哈希法最基础的实现工具。
我看到我自己实现的哈希算法,在整体速度上排第三。后面的都是使用 HashMap 来做的。
别人的思路
和自己的差不多,但是可以对我的算法进行优化。时间复杂度压缩到 O(N),将我额外的两个循环的判断逻辑放到了第一个循环上,实现效率上的提升。
class Solution { public char slowestKey(int[] releaseTimes, String keysPressed) { int time = releaseTimes[0]; char res = keysPressed.charAt(0); for (int i = 1; i < keysPressed.length(); i++) { int cur = releaseTimes[i] - releaseTimes[i - 1]; if (time < cur || (time == cur && res < keysPressed.charAt(i))) { time = cur; res = keysPressed.charAt(i); } } return res; } }
这样看,优化过后的算法就是一个 贪心算法。不断取最大值,获取当前的局部最优,最后得到全局最优。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于