Easy
题目描述
给你一个二维数组 events,表示一个孩子在键盘上按一系列按钮的事件序列。
每个 events[i] = [indexi, timei] 表示在时间 timei 时按下了索引为 indexi 的按钮。
- 数组按时间递增排序。
- 按下按钮所需的时间是连续两次按钮按下之间的时间差。第一个按钮的时间就是它被按下的时间。
返回按下时间最长的按钮的索引。如果有多个按钮的按下时间相同且都是最长的,返回索引最小的按钮。
示例 1:
输入:events = [[1,2],[2,5],[3,9],[1,15]]
输出:1
解释:
- 索引为 1 的按钮在时间 2 被按下。
- 索引为 2 的按钮在时间 5 被按下,所以它花费了 5 - 2 = 3 个时间单位。
- 索引为 3 的按钮在时间 9 被按下,所以它花费了 9 - 5 = 4 个时间单位。
- 索引为 1 的按钮在时间 15 再次被按下,所以它花费了 15 - 9 = 6 个时间单位。
示例 2:
输入:events = [[10,5],[1,7]]
输出:10
解释:
- 索引为 10 的按钮在时间 5 被按下。
- 索引为 1 的按钮在时间 7 被按下,所以它花费了 7 - 5 = 2 个时间单位。
提示:
1 <= events.length <= 1000events[i] == [indexi, timei]1 <= indexi, timei <= 10^5- 输入保证
events按timei递增排序。
解题思路
这是一道简单的数组遍历问题,核心思路是计算每个按钮事件的时间间隔,并找到最大值。
思路分析:
理解时间间隔计算:第一个按钮的时间间隔就是它的时间戳,后续按钮的时间间隔是当前时间减去前一个按钮的时间。
遍历计算:遍历所有事件,对每个事件计算时间间隔。维护当前最大时间间隔和对应的按钮索引。
处理相同时间的情况:当遇到相同的最大时间间隔时,选择索引更小的按钮。这里需要注意,我们只在时间间隔严格大于当前最大值时才更新结果。
算法步骤:
- 初始化最大时间间隔为第一个按钮的时间戳
- 初始化结果为第一个按钮的索引
- 从第二个事件开始遍历,计算时间间隔
- 如果时间间隔更大,或者时间间隔相等但索引更小,则更新结果
这种方法只需要一次遍历,时间复杂度为 O(n),空间复杂度为 O(1),是最优解法。
代码实现
class Solution {
public:
int buttonWithLongestTime(vector<vector<int>>& events) {
int maxTime = events[0][1];
int result = events[0][0];
for (int i = 1; i < events.size(); i++) {
int currentTime = events[i][1] - events[i-1][1];
int currentIndex = events[i][0];
if (currentTime > maxTime ||
(currentTime == maxTime && currentIndex < result)) {
maxTime = currentTime;
result = currentIndex;
}
}
return result;
}
};
class Solution:
def buttonWithLongestTime(self, events: List[List[int]]) -> int:
max_time = events[0][1]
result = events[0][0]
for i in range(1, len(events)):
current_time = events[i][1] - events[i-1][1]
current_index = events[i][0]
if (current_time > max_time or
(current_time == max_time and current_index < result)):
max_time = current_time
result = current_index
return result
public class Solution {
public int ButtonWithLongestTime(int[][] events) {
int maxTime = events[0][1];
int result = events[0][0];
for (int i = 1; i < events.Length; i++) {
int currentTime = events[i][1] - events[i-1][1];
int currentIndex = events[i][0];
if (currentTime > maxTime ||
(currentTime == maxTime && currentIndex < result)) {
maxTime = currentTime;
result = currentIndex;
}
}
return result;
}
}
var buttonWithLongestTime = function(events) {
let maxTime = events[0][1];
let result = events[0][0];
for (let i = 1; i < events.length; i++) {
let pushTime = events[i][1] - events[i-1][1];
if (pushTime > maxTime || (pushTime === maxTime && events[i][0] < result)) {
maxTime = pushTime;
result = events[i][0];
}
}
return result;
};
复杂度分析
| 复杂度 | 大小 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
其中 n 是 events 数组的长度。算法只需要遍历一次数组,使用常数额外空间。