← Static tasks

362. Design Hit Counter

leetcode medium

#csharp#design#leetcode#matrix#medium#queue#string

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/original
using 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/original
class 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/original
class 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/original
from 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/original
package 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 минут.

😎