LeetCode最初の175週間のレース

5332. 整数倍と数があることを確認

タイトル説明

あなたの整数の配列を与えるためにarr、二つの整数があることを確認してくださいNM出会いがNあるM(すなわち、二回N = 2 * M)。

2つの添字がある場合より正式に、チェックij出会います:

  • i != j
  • 0 <= i, j < arr.length
  • arr[i] == 2 * arr[j]

分析タイトル

list変換されset、それが直接決定され、その後。

注:それはする必要があります0 * 2 = 0ので、0それは別にそれ以外の場合はエラーに対処する必要があります。 

コード

class Solution:
    def checkIfExist(self, arr: List[int]) -> bool:
        memo = set(arr)
        if arr.count(0) > 1: return True
        for i in arr:
            if 2 * i in memo and i != 0:
                return True
        return False

複雑性分析

時間の複雑さ:O(n)構成されたsetトラバースarrの両方O(n);複雑スペース:O(1)

5333. 製造文字の単語数異所性の最小ステップ

タイトル説明

あなたは長さの等しい2つの文字列を与えるst各ステップは、あなたが選ぶことができるt任意の1文字に置き換えられ、別の文字

リターンtになるためのs単語異所性最小工程での文字の数。

異所性ワード文字が同じ文字を指しますが、別の文字列に配置されました

分析タイトル

まず、ワードカウントは、対応する差分を加算することにより行った。これは、二つの間の文字列の合計で見つけることができる多くの異なるがされていません。一次変換は、二つの異なる文字を小さくすることができます

コード

class Solution:
    def minSteps(self, s: str, t: str) -> int:
        def count(s):
            ans = [0] * 26
            for i in s:
                ans[ord(i) - ord('a')] += 1
            return ans
        return sum(abs(i - j) for i, j in zip(count(s), count(t))) // 2

複雑性分析

時間計算:O(n)横断s , tすべてO(n)、複雑なスペースを:O(1)

1348 プッシュメッセージ数

タイトル説明

あなたは、つぶやきカウントクラスに次の2つの方法の実現をサポートすることができますTweetCounts

1。recordTweet(string tweetName, int time)

  • ツイートの記録を掲載:ユーザーtweetNametime(で単位)は、時間のツイートを投稿しました。

2。getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime)

  • 開始時刻からの復帰startTime(への第二単位)時間の終わりにendTime(内秒の各内のユニット)のサブ *時間*または日の日* *(に応じてfreq)ユーザーが指定したtweetNameツイートの総数が投稿しました。
  • freq値は常に分割 分をときに 時間又は 一つは、ユーザ指定の検索tweetNameツイートの数インターバル時間。
  • 第1の時間間隔から常にあるstartTime時間間隔ので、初め[startTime, startTime + delta*1>, [startTime + delta*1, startTime + delta*2>, [startTime + delta*2, startTime + delta*3>, ... , [startTime + delta*i, **min**(startTime + delta*(i+1), endTime + 1)>ものでiあり、delta(に応じてfreq非負の整数です)。

分析タイトル

難易度は、読み取り対象、およびいくつかの間隔の判断、あるtime間隔です。

まず、freq計算間隔

間隔startTime, endTime計算区間数、

横断します

コード

class TweetCounts:
    def __init__(self):
        self.memo = {}

    def recordTweet(self, tweetName: str, time: int) -> None:
        if tweetName in self.memo: self.memo[tweetName].append(time)       
        else: self.memo[tweetName] = [time]
          
    def getTweetCountsPerFrequency(self, freq: str, tweetName: str, startTime: int, endTime: int) -> List[int]:
        import math
        d = 60
        if freq == 'hour': d = 3600
        elif freq == 'day': d = 86400
        ans = [0] * math.ceil((endTime - startTime + 1) / d)
        for i in self.memo[tweetName]:
            if i < startTime or i > endTime: continue
            ans[(i-startTime) // d] += 1
        return ans

5335. 試験を受ける学生の最大数

タイトル説明

あなたを与えるm * n行列seats教室の座席の分布の表現を。シートは、(利用できない)悪い場合、使用が'#'表し;そうでなければ、と'.'表現。

学生は左に見ることができ、右、左上、右上次の彼の学生の4つの方向への答えが、生徒たちは彼が答えのか、後ろの正面に座って見ることができません。仕事とリターン一緒に試験を受けて、検査室が保持できるごまかすことができない学生の最大数をしてください。

学生は席に座って良好な状態でなければなりません。

分析タイトル

主題の意味に従っては、前の行の状態の和の現在の行の状態を知ることができ、各列までの状態に対し、2^8 = 64各行わずか8席、。
で\ [DP [I] [J] = MAX_ {J \ [1 、64]}(DP [I
count(j) -1] [J] +カウント(J))\] で表される:jのバイナリ表現1数。

ビットオペレーティング

seatsバイナリ表現に各行、'#'=0, '.'=1各ラインが示さrow[i]
状態もバイナリ表現を使用している1一部の人が行うこと:0:誰もが、現在のステータスコードを設定し、やっていなかったことをjラインステータスコードの前に、k
すべての人の座席の最初に、左右します両側のための必要十分条件は、生活の中ですることはできません。j & (j << 1) == 0 and j & (j >> 1) == 0
人々は悪い席のために必要かつ十分な条件の上に座ることができません:j & row[i] == j
人々は場所、最前列の位置の周りの必要十分条件は人間ではない操作を行います。j & (pre << 1) == 0 and j & (pre >> 1) == 0

コード

class Solution:
    def maxStudents(self, seats: List[List[str]]) -> int:
        dp = {0:0}
        arr = [0] * len(seats)
        for i, row in enumerate(seats):
            for j in row:
                arr[i] = arr[i] * 2 + (1 if j == '.' else 0)
        for i in range(len(arr)):
            newdp = {}
            for j in range(1 << len(seats[0])):
                if j & arr[i] != j or j & (j << 1) != 0 or j & (j >> 1) != 0: continue
                num = bin(j).count('1')
                for k, v in dp.items():
                    if j & (k << 1) != 0 or j & (k >> 1) != 0: continue
                    newdp[j] = max(newdp.get(j, 0), v + num)
            dp = newdp
        return max(dp.values())

おすすめ

転載: www.cnblogs.com/blogcyh/p/12289405.html