362. Design Hit Counter
leetcode medium
Task
Дана матрица размером m x n, где каждая ячейка является либо стеной 'W', либо врагом 'E', либо пустой '0'. Верните максимальное количество врагов, которых можно уничтожить, используя одну бомбу. Вы можете разместить бомбу только в пустой ячейке.
Бомба уничтожает всех врагов в той же строке и столбце от точки установки до тех пор, пока не встретит стену, так как она слишком сильна, чтобы быть разрушенной.
Пример:
Input
["HitCounter", "hit", "hit", "hit", "getHits", "hit", "getHits", "getHits"]
[[], [1], [2], [3], [4], [300], [300], [301]]
Output
[null, null, null, null, 3, null, 4, 3]
Explanation
HitCounter hitCounter = new HitCounter();
hitCounter.hit(1); // hit at timestamp 1.
hitCounter.hit(2); // hit at timestamp 2.
hitCounter.hit(3); // hit at timestamp 3.
hitCounter.getHits(4); // get hits at timestamp 4, return 3.
hitCounter.hit(300); // hit at timestamp 300.
hitCounter.getHits(300); // get hits at timestamp 300, return 4.
hitCounter.getHits(301); // get hits at timestamp 301, return 3.
C# solution
matched/originalusing System;
using System.Collections.Generic;
public class HitCounter {
private Queue<int> hits;
public HitCounter() {
hits = new Queue<int>();
}
public void Hit(int timestamp) {
hits.Enqueue(timestamp);
}
public int GetHits(int timestamp) {
while (hits.Count > 0 && timestamp - hits.Peek() >= 300) {
hits.Dequeue();
}
return hits.Count;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class HitCounter {
private queue<int> hits;
public HitCounter() {
hits = new queue<int>();
}
public void Hit(int timestamp) {
hits.Enqueue(timestamp);
}
public int GetHits(int timestamp) {
while (hits.size() > 0 && timestamp - hits.Peek() >= 300) {
hits.Dequeue();
}
return hits.size();
}
}Java solution
matched/originalclass HitCounter {
private Queue<Integer> hits;
public HitCounter() {
this.hits = new LinkedList<Integer>();
}
public void hit(int timestamp) {
this.hits.add(timestamp);
}
public int getHits(int timestamp) {
while (!this.hits.isEmpty()) {
int diff = timestamp - this.hits.peek();
if (diff >= 300) this.hits.remove();
else break;
}
return this.hits.size();
}
}JavaScript solution
matched/originalclass HitCounter {
constructor() {
this.hits = [];
}
hit(timestamp) {
this.hits.push(timestamp);
}
getHits(timestamp) {
while (this.hits.length > 0 && timestamp - this.hits[0] >= 300) {
this.hits.shift();
}
return this.hits.length;
}
}Python solution
matched/originalfrom collections import deque
class HitCounter:
def __init__(self):
self.hits = deque()
def hit(self, timestamp: int) -> None:
self.hits.append(timestamp)
def getHits(self, timestamp: int) -> int:
while self.hits and timestamp - self.hits[0] >= 300:
self.hits.popleft()
return len(self.hits)Go solution
matched/originalpackage main
type HitCounter struct {
hits []int
}
func Constructor() HitCounter {
return HitCounter{hits: []int{}}
}
func (this *HitCounter) Hit(timestamp int) {
this.hits = append(this.hits, timestamp)
}
func (this *HitCounter) GetHits(timestamp int) int {
start := 0
for start < len(this.hits) && timestamp - this.hits[start] >= 300 {
start++
}
this.hits = this.hits[start:]
return len(this.hits)
}Explanation
Algorithm
При вызове метода hit(int timestamp), добавьте временную метку в очередь.
При вызове метода getHits(int timestamp), удалите все временные метки из очереди, которые старше 300 секунд от текущей временной метки.
Верните размер очереди как количество попаданий за последние 5 минут.
😎