ディレクトリ
トピック1:最小のサブシーケンスの非昇順
トピックリンク: https://leetcode-cn.com/problems/minimum-subsequence-in-non-increasing-order/
問題解決のアイデア:
数字に前方から、ソート、それぞれが判断が半分合計よりも大きい取ります
もしそうならば、結果が返されます
コードの実装:
class Solution:
def minSubsequence(self, nums: List[int]) -> List[int]:
nums.sort()
total = sum(nums)
res = []
for index in range(len(nums) - 1, -1, -1):
res.append(nums[index])
if sum(res) > total / 2:
break
return res
タイトルII:工程数のバイナリ表現を1に低減されます
トピックリンク: https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one/
問題解決のアイデア:
この方法の一つ:
バイナリ文字列は、整数変数、規則に従って各シミュレーションステップ、及び重畳の数に変換しました
方法2:
背面から前面へのトラバーサルはそれぞれ、キャリー識別を追加します。キャリーフラグ一緒にトラバースするとき、次のような状況が存在します。
- 0:説明は、偶数ステップ1 +の数であります
- 1:説明は、このビットを除去するために、1 + 2の後にデジタル加算するための現在の必要奇数、2 +、キャリー= 1ステップ
- 2:元々説明奇数が、キャリーを加えた後偶数、ステップ番号+ 1、キャリー= 1となります
コードの実装:
この方法の一つ:
class Solution:
def numSteps(self, s: str) -> int:
num = int(s, 2)
count = 0
while num > 1:
if num % 2 == 0:
num //= 2
else:
num += 1
count += 1
return count
方法2:
class Solution:
def numSteps(self, s: str) -> int:
count = 0
add_num = 0
for index in range(len(s) - 1, -1, -1):
num = int(s[index]) + add_num
add_num = 0
if index == 0 and add_num == 0 and num == 1:
break
if 0 == num:
count += 1
elif 1 == num:
count += 2
add_num = 1
else:
count += 1
add_num = 1
return count
トピック3:ハッピー最長の文字列
トピックリンク: https://leetcode-cn.com/problems/longest-happy-string/
問題解決のアイデア:
残りのステッチは、現在の文字スプライスか否かを判断降順で、文字の現在の数に従ってソートすることができます
スプライシング場合は、単一の文字のスプライシングは、残数を更新します
スプライシングされていない場合は、シーケンス内の次の文字を取得します
すべての文字があるまで、すべての文字は、スプライシングされたか、不足することはできません
コードの実装:
class Solution:
def longestDiverseString(self, a: int, b: int, c: int) -> str:
num_lst = {'a' : a, 'b' : b, 'c' : c}
res = ''
while sum(num_lst.values()) > 0:
stop = False
for a in sorted(num_lst.items(), key = lambda item: item[1], reverse = True):
if res[-2:] == a[0] * 2 or a[1] <= 0:
stop = True
continue
res += a[0]
num_lst[a[0]] -= 1
stop = False
break
if stop:
break
return res
トピック4:石ゲームIII
トピックリンク: https://leetcode-cn.com/problems/stone-game-iii/
問題解決のアイデア:
問題のゲーム理論の種類、動的プログラミング、奥から手前に再帰
最後に、インデックスから石の残りの山の間に、最大のスコアを取得することができた場合、最初のインデックス位置DPダイナミックプログラミング配列は番号があり、保存されました
あなたはその最後のDP配列を処理しなければならないので、前回の残りの部分は、元の配列は、最後のビットに等しい場合
順方向再帰後に、次のようにロジックをプログラムの最初のインデックス更新ビットダイナミックアレイである場合、前回の再帰から現在位置までの合計を追加します。
変数:
- インデックス:現在の再発へのインデックス
- DP:動的プログラミングのアレイ(マルチアプリケーション比stoneValue 3、図は、これは、添え字のための特別な治療することはできない0です。)
- curr_sum:和の最後のビットからインデックスへ
- stoneValue:元の配列、配列がここで想定している[1、2、3、-1、-2、-3、7]
ロジック(後方から前方へstoneValueトラバーサル):
- 更新curr_sum = curr_sum + stoneValue [インデックス] = 0 + 7 = 7
- 初期DP [インデックス] =フロート( ' - INF')微小
- 論理DPを更新する[インデックス]を念頭において、以下の表、DPの更新式[インデックス] = curr_sum - 分(DP [インデックス+ 1]、DP [索引+ 2]、DP [索引+ 3])の目的これは、最大値を取得するために、可能な限り迅速に、自分の価値を作ることができ
横断DPまで上記ステップを継続[0]
あなたの行動 他始まった添字 最大値の反対側 あなたの最大 取ります インデックス+ 1 DP [インデックス+ 1] curr_sum - DP [インデックス+ 1] テイク2 インデックス+ 2 DP [索引+ 2] curr_sum - DP [索引+ 2] テイク3 インデックス+ 3 DP [索引+ 3] curr_sum - DP [索引+ 3] アリスはDP [0]の最大スコアを得ることができるようにアリスは常に、最初に起動するので、ボブはcurr_sumの最大のスコアを取得することができます - DPを[0]
その後、スコアはアリスとボブに決定されます
コードの実装:
class Solution:
def stoneGameIII(self, stoneValue: List[int]) -> str:
dp = [0] * (len(stoneValue) + 3)
curr_sum = 0
for index in range(len(stoneValue) - 1, -1, -1):
dp[index] = float('-inf')
curr_sum += stoneValue[index]
dp[index] = curr_sum - min([dp[index + 1], dp[index + 2], dp[index + 3]])
alice_score = dp[0]
bob_score = curr_sum - dp[0]
if alice_score > bob_score:
return 'Alice'
elif alice_score < bob_score:
return 'Bob'
return 'Tie'