Pythonで最大サブアレイ最小積を見つけるプログラム
配列numsがあるとすると、numsの空でない各サブ配列の最大最小積を見つける必要があります。答えは十分に大きい可能性があるため、10 ^ 9+7を法として返します。配列の最小積は、配列の最小値に配列の合計を掛けたものに等しくなります。したがって、[4,3,6](最小値は3)のような配列がある場合、最小積は3 *(4 + 3 + 6)=3 * 13=39になります。
したがって、入力がnums =[2,3,4,3]のような場合、結果を最大化するためのサブ配列[3,4,3]を取得できるため、出力は30になります。したがって、3 *(3 + 4 + 3)=3 * 10=30。
これを解決するには、次の手順に従います-
-
m:=10 ^ 9 + 7
-
スタック:=新しいスタック
-
rsum:=0、res:=0
-
numsの最後に0を挿入します
-
インデックスiと値v(nums)ごとに、実行します
-
スタックが空ではなく、nums[スタックの最上位のインデックス]>=vの場合、実行
-
index、val):=スタックの一番上にあり、スタックからポップします
-
arrSum:=rsum
-
スタックが空でない場合は、
-
arrSum:=rsum-スタックの最上位の値
-
-
res:=resと(nums [index] * arrSum)の最大値
-
-
rsum:=rsum + v
-
スタックの最後で(i、rsum)をプッシュします
-
-
resmodmを返す
例
理解を深めるために、次の実装を見てみましょう-
def solve(nums): m = int(1e9+7) stack = [] rsum = 0 res = 0 nums.append(0) for i, v in enumerate(nums): while stack and nums[stack[-1][0]] >= v: index, _ = stack.pop() arrSum=rsum if stack: arrSum=rsum-stack[-1][1] res=max(res, nums[index]*arrSum) rsum += v stack.append((i, rsum)) return res % m nums = [2,3,4,3] print(solve(nums))
入力
[2,3,4,3]
出力
30
-
Pythonで最大の建物の高さを見つけるプログラム
値nと、制限と呼ばれるペアの別のリストがあるとします。都市にn棟の新しい建物を建てたいと思っています。ただし、制限はほとんどありません。私たちは一列に建てることができ、建物には1からnまでのラベルが付けられています。制限には2つのパラメーターがあるため、restrictions [i] =(id_i、max_height_i)は、id_iの高さがmax_height_i以下でなければならないことを示します。新しい建物の高さに関する市の制限は次のとおりです- 各建物の高さは0または正の値である必要があります。 最初の建物の高さは0でなければなりません。 隣接する2つの建物の高さ
-
Pythonで範囲内のノード数を見つけるプログラム
BSTがあり、左と右の境界lとrもあるとすると、lとrの間に値が存在するルート内のすべてのノードの数を見つける必要があります。 したがって、入力が次のような場合 l =7、r =13の場合、8、10、12の3つのノードがあるため、出力は3になります。 これを解決するために、次の手順に従います- スタック:=スタックと最初にルートを挿入し、カウント:=0 スタックが空でないときに、実行します node:=スタックの最上位要素、およびポップ要素 ノードがnullでない場合、 l<=ノードのデータ<=rの場合、 count:=count + 1