前往
大廳
主題

LeetCode - 1551. Minimum Operations to Make Array Equal 解題心得

Not In My Back Yard | 2021-06-03 00:00:02 | 巴幣 0 | 人氣 197

題目連結:


題目意譯:
你有一個陣列 arr 長度為 n ,其中 arr[i] = (2 × i) + 1 對於所有合法值 i (即 0 ≦ i < n)。

在一次操作中,你可以選擇兩個索引值 x 和 y 其中 0 ≦ x 、 y < n ,並且將 arr[x] 減去 1 並將 arr[y] 加上 1 (即執行 arr[x] -= 1 和 arr[y] += 1)。目標是使得陣列中所有元素都相同。保證陣列中的元素可以經由若干次操作變為相同值。

給定一整數 n,即陣列之長度。回傳最少所需操作數使得陣列元素變為一樣。

限制:
1 ≦ n ≦ 10 ^ 4



範例測資:
範例 1:
輸入: n = 3
輸出: 2
解釋: arr = [1, 3, 5]
第一次操作選擇 x = 2 和 y = 0,這導致 arr 變為 [2, 3, 4]
在第二次操作中再次選擇 x = 2 和 y = 0,因此 arr = [3, 3, 3]。

範例 2:
輸入: n = 6
輸出: 9


解題思維:
根據題意,長度為 n 的陣列中的數字一開始為前 n 個奇數。而前 n 個奇數的總和為 n ^ 2 。 n ^ 2 除以 n 為 n ,所以陣列中所有數字最後都會變成 n 。

因為每一次操作將某數加上 1 、某數減去 1,因此最少操作數是從正中間將數字分成左右兩邊。將右半邊最大的數字減去 1 ,加到左半邊最洗的數字。

這樣做就得到最少操作數。而最少操作數之值為
展開後得
簡化得
而上式等價於
而我們便得到了本題的公式解。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作