LeetCode Daily 8
2022-1-9 T1629.按键持续时间最长的键
一月份的力扣太令人安心了??
题目描述:
给你一个长度为 n 的字符串 keysPressed ,其中 keysPressed[i] 表示测试序列中第 i 个被按下的键。releaseTimes 是一个升序排列的列表,其中 releaseTimes[i] 表示松开第 i 个键的时间。字符串和数组的 下标都从 0 开始 。第 0 个键在时间为 0 时被按下,接下来每个键都 恰好 在前一个键松开时被按下。 测试人员想要找出按键 持续时间最长 的键。第 i 次按键的持续时间为 releaseTimes[i] - releaseTimes[i - 1] ,第 0 次按键的持续时间为 releaseTimes[0] 。 注意,测试期间,同一个键可以在不同时刻被多次按下,而每次的持续时间都可能不同。 请返回按键 持续时间最长 的键,如果有多个这样的键,则返回 按字母顺序排列最大 的那个键。
示例:
输入:releaseTimes = [9,29,49,50], keysPressed = "cbcd" 输出:"c" 解释:按键顺序和持续时间如下: 按下 'c' ,持续时间 9(时间 0 按下,时间 9 松开) 按下 'b' ,持续时间 29 - 9 = 20(松开上一个键的时间 9 按下,时间 29 松开) 按下 'c' ,持续时间 49 - 29 = 20(松开上一个键的时间 29 按下,时间 49 松开) 按下 'd' ,持续时间 50 - 49 = 1(松开上一个键的时间 49 按下,时间 50 松开) 按键持续时间最长的键是 'b' 和 'c'(第二次按下时),持续时间都是 20 'c' 按字母顺序排列比 'b' 大,所以答案是 'c'
思路:
本题需注意按键最大时间是单次时间,而不是累加时间。
相同时按字典序排序需另加比较。
代码:
class Solution { public: char slowestKey(vector<int>& releaseTimes, string keysPressed) { vector<int> key(26, 0); char res = 'a'; int ans = releaseTimes[0]; key[keysPressed[0] - 'a'] = ans; for(int i = 1; i < keysPressed.size(); i++){ ans = releaseTimes[i] - releaseTimes[i - 1]; key[keysPressed[i] - 'a'] = max(ans, key[keysPressed[i] - 'a']); } int maxValue = -1; for(int i = 0; i < 26; i++) { if(key[i] >= maxValue) { res = 'a' + i; maxValue = key[i]; } } return res; } };