如何理解使用動態規劃求解滑動視窗最大值

2022-07-11 04:39:10 字數 1778 閱讀 8440

給定乙個陣列nums,有乙個大小為k的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的k個數字。滑動視窗每次只向右移動一位。

返回滑動視窗中的最大值。

示例:

輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3

輸出: [3,3,5,5,6,7]

解釋:

滑動視窗的位置 最大值

--------------- -----

[1 3 -1] -3 5 3 6 7 3

1 [3 -1 -3] 5 3 6 7 3

1 3 [-1 -3 5] 3 6 7 5

1 3 -1 [-3 5 3] 6 7 5

1 3 -1 -3 [5 3 6] 7 6

1 3 -1 -3 5 [3 6 7] 7

public int maxslidingwindow(int nums, int k) 

int output = new int[n - k + 1];

for (int i = 0; i < n - k + 1; i++)

output[i] = math.max(left[i + k - 1], right[i]);

return output;

}

當滑動視窗包含3,-1,-3時,這個滑動視窗就跨越了兩個塊,右塊的最大值只能是-3,因為這時右塊只有乙個值-3。而左塊有兩個值,怎麼知道左塊的最大值是3呢?我的意思是怎麼只比較3-3,從圖中的確很直觀地看到3是左塊中最大的值,如果把-1換成是4呢?

當看到right陣列前三個數為4,4,4時,就會發現left陣列和right陣列的規律。

left陣列的每個塊裡面的右邊的數總是大於等於左邊的數,而right陣列的每個塊裡面的左邊的數總是大於等於右邊的數。left陣列和right陣列的規律是一樣的,只是方向不同。

解答:

當滑動視窗包含3,-1,-3時,right陣列包含3,-1,5,因為3>=-1,所以只需要比較3-3

參考:

如何理解動態規劃?

long time ago,當我剛看到動態規劃這個響亮的大名時,瞬間陷入了沉思,腦中浮想聯翩,揣摩著這個演算法應該很帶感。查了一下維基百科 不建議你閱讀 動態規劃在尋找有很多重疊子問題的情況的最佳解時有效。它將問題重新組合成子問題。為了避免多次解決這些子問題,它們的結果都逐漸被計算並被儲存,從簡單的...

動態規劃 如何求解金礦問題

漫畫演算法 小灰的演算法之旅 5.11 假設現在有5座金礦,每座金礦的 儲存量不同,需要參入挖掘的工人人數也不同。要求 參入挖礦的工人的總數是10.每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一般 要求用程式求出,要想得到盡可能多的 應該選取那幾座金礦?金礦內容 400,500,200,300,3...

如何簡單的理解動態規劃?

動態規劃是一種類似於回溯的思想,他通過空間換時間的方法提高效率,一般用於求最優解問題。在上面我說道,動態規劃其實和回溯很類似。回溯思想在前面的文章我提到過,回溯是一種窮舉可能的方法。動態規劃則是通過額外的空間將回溯的遞迴樹中不需要的可能提前剪除達到提高效率的目的。我們來回憶一下回溯能解決的問題的特徵...