LeetCode-Python-1396。地下鉄システムの設計(ハッシュテーブル)

以下の3つのメソッドをサポートするUndergroundSystemクラスを実装してください。

1. checkIn(int id、string stationName、int t)

ID番号が付けられた乗客が時刻tに地下鉄駅stationNameに入ります。
乗客は同時に1つの地下鉄駅にのみ出入りできます。
2. checkOut(int id、string stationName、int t)

ID番号の乗客が時刻tに地下鉄駅stationNameを出発します。
3. getAverageTime(文字列startStation、文字列endStation) 

地下鉄駅startStationから地下鉄駅endStationまでの平均滞在時間を返します。
平均時間で計算されたトリップには、startStationからendStationまでのすべてのトリップが含まれます。
getAverageTimeを呼び出すと、リクエストされたルートに少なくとも1つのルートが含まれます。
checkInおよびcheckOutへのすべての呼び出しは論理的であると想定できます。つまり、時刻t1に顧客が地下鉄の駅に到着した場合、顧客が出発する時刻t2はt2> t1を満たす必要があります。すべてのイベントは時系列で示されています。

 

例:

入力:
["UndergroundSystem"、 "checkIn"、 "checkIn"、 "checkIn"、 "checkOut"、 "checkOut"、 "checkOut"、 "getAverageTime"、 "getAverageTime"、 "checkIn"、 "getAverageTime"、 "checkOut" 、 "getAverageTime"]
[[]、[45、 "Leyton"、3]、[32、 "Paradise"、8]、[27、 "Leyton"、10]、[45、 "Waterloo"、15]、[ 27、 "ウォータールー"、20]、[32、 "ケンブリッジ"、22]、["パラダイス"、 "ケンブリッジ"]、["レイトン"、 "ウォータールー"]、[10、 "レイトン"、24]、[ "レイトン"、 "ウォータールー"]、[10、 "ウォータールー"、38]、["レイトン"、 "ウォータールー"]]

出力:
[null、null、null、null、null、null、null、14.0,11.0、null、11.0、null、12.0]

説明:
UndergroundSystem UndergroundSystem = new UndergroundSystem(); UndergroundSystem.checkIn(
45、 "Leyton"、3);
UndergroundSystem.checkIn(32、 "Paradise"、8);
UndergroundSystem.checkIn(27、 "Leyton"、10);
UndergroundSystem .checkOut(45、 "Waterloo"、15);
UndergroundSystem.checkOut(27、 "Waterloo"、20);
UndergroundSystem.checkOut(32、 "Cambridge"、22);
UndergroundSystem.getAverageTime( "Paradise"、 "Cambridge") ; // 14.0を返します。"Paradise"(時間8)から "Cambridge"(時間22)への移動は1つだけです
undergroundSystem.getAverageTime( "Leyton"、 "Waterloo"); // 11.0を返します。「レイトン」から「ウォータールー」まで2つあります 旅程、ID = 45の乗客は時刻= 3に出発し、時刻= 15に到着します。ID= 27の乗客は時刻= 10に出発し、時刻= 20に到着します。したがって、平均時間は((15-3)+(20-10))/ 2 = 11.0です。
UndergroundSystem.checkIn(10、 "レイトン"、24);
UndergroundSystem.getAverageTime( "Leyton"、 "Waterloo"); // 11.0
UndergroundSystem.checkOut(10、 "Waterloo"、38);を返します。
UndergroundSystem.getAverageTime( "Leyton"、 "Waterloo"); // 12.0を返します
 

ヒント:

合計で最大20,000の操作があります。
1 <= id、t <= 10 ^ 6
すべての文字列には、大文字、小文字、数字が含まれます。
1 <= stationName.length <= 10
標準誤差が10 ^ -5以内の結果は、正しい結果と見なされます。

ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/design-underground-system
著作権はDeduction Networkに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。

アイデア:

平均値が必要なため、2つの鉄道駅間の移動に費やした合計時間と移動回数を記録する必要があることは明らかです。ハッシュテーブルを使用するだけです。

次に、checkOutの場合、IDを指定すると、車のIDの場所と時刻を知る必要があります。これもハッシュテーブルです。

時間の複雑さ:O(1)、すべての操作

スペースの複雑さ:O(N ^ 2 + K)、Nは駅の数、Kはトリップの数

class UndergroundSystem(object):

    def __init__(self):
        from collections import defaultdict
        self.cnt = defaultdict(int) # 记录总次数
        self.total = defaultdict(int) # 记录总时间
        self.record = {} # key is id, val is the checkin stationName and time
    def checkIn(self, id, stationName, t):
        """
        :type id: int
        :type stationName: str
        :type t: int
        :rtype: None
        """
        self.record[id] = (stationName, t)

    def checkOut(self, id, stationName, t):
        """
        :type id: int
        :type stationName: str
        :type t: int
        :rtype: None
        """
        checkinStation = self.record[id][0]
        checkinTime = self.record[id][1]
        
        self.total[checkinStation + "#" + stationName] += t - checkinTime
        self.cnt[checkinStation + "#" + stationName] += 1


    def getAverageTime(self, startStation, endStation):
        """
        :type startStation: str
        :type endStation: str
        :rtype: float
        """
        return self.total[startStation + "#" + endStation] * 1.0 / self.cnt[startStation + "#" + endStation]

 

元の記事を734件公開 121件の賞賛 21万回表示

おすすめ

転載: blog.csdn.net/qq_32424059/article/details/105194549