5332. 整数倍と数があることを確認
タイトル説明
あなたの整数の配列を与えるためにarr
、二つの整数があることを確認してくださいN
とM
出会いがN
あるM
(すなわち、二回N = 2 * M
)。
2つの添字がある場合より正式に、チェックi
とj
出会います:
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つの文字列を与えるs
とt
。各ステップは、あなたが選ぶことができる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)
- ツイートの記録を掲載:ユーザー
tweetName
でtime
(で秒単位)は、時間のツイートを投稿しました。
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())