ETH官方钱包

前往
大廳
主題

LeetCode - 2256. Minimum Average Difference 解題心得

Not In My Back Yard | 2023-02-19 12:00:08 | 巴幣 1002 | 人氣 244

題目連結:


題目意譯:
你被給定索引值從 0 開始且長度為 n 的整數陣列 nums。

索引值 i 的平均差為 nums 的開頭 i + 1 個元素之平均與結尾 n - i - 1 個元素之平均的絕對差值。兩個平均值應向下取整到最接近的整數。
 
回傳有著最小平均差的索引值。如果存在多個這樣子的索引值,則回傳索引值最小的。

注:
兩數的絕對差值為它們之間的差值之絕對值。
n 個元素的平均值為 n 個元素之和除以 n(整數除法)。
0 個元素的平均值應視為是 0。

限制:
1 ≦ nums.length ≦ 10 ^ 5
0 ≦ nums[i] ≦ 10 ^ 5



範例測資:
範例 1:
輸入: nums = [2,5,3,9,5,3]
輸出: 3
解釋:
- 索引值 0 的平均差為:|2 / 1 - (5 + 3 + 9 + 5 + 3) / 5| = |2 / 1 - 25 / 5| = |2 - 5| = 3。
- 索引值 1 的平均差為:|(2 + 5) / 2 - (3 + 9 + 5 + 3) / 4| = |7 / 2 - 20 / 4| = |3 - 5| = 2。
- 索引值 2 的平均差為:|(2 + 5 + 3) / 3 - (9 + 5 + 3) / 3| = |10 / 3 - 17 / 3| = |3 - 5| = 2。
- 索引值 3 的平均差為:|(2 + 5 + 3 + 9) / 4 - (5 + 3) / 2| = |19 / 4 - 8 / 2| = |4 - 4| = 0。
- 索引值 4 的平均差為:|(2 + 5 + 3 + 9 + 5) / 5 - 3 / 1| = |24 / 5 - 3 / 1| = |4 - 3| = 1。
- 索引值 5 的平均差為:|(2 + 5 + 3 + 9 + 5 + 3) / 6 - 0| = |27 / 6 - 0| = |4 - 0| = 4。
索引值 3 的平均差是最小的平均差值,所以回傳 3。

範例 2:
輸入: nums = [0]
輸出: 0
解釋:
唯一的索引值是 0,所以回傳 0。
索引值 0 的平均差為:|0 / 1 - 0| = |0 - 0| = 0。


解題思維:
可以看到題目的意思基本上就是對於每個索引值 i,將 nums 分成兩側。一側是「nums[i] 的左側」且這邊包含 nums[i] 本身、另一側則是「nums[i] 的右側」(不包含 nums[i])。求出兩側的平均之差。

而從範例一的解釋中可以看出本題要怎麼解:
- 索引值 0 的平均差為:|2 / 1 - (5 + 3 + 9 + 5 + 3) / 5| = |2 / 1 - 25 / 5| = |2 - 5| = 3。
- 索引值 1 的平均差為:|(2 + 5) / 2 - (3 + 9 + 5 + 3) / 4| = |7 / 2 - 20 / 4| = |3 - 5| = 2。
- 索引值 2 的平均差為:|(2 + 5 + 3) / 3 - (9 + 5 + 3) / 3| = |10 / 3 - 17 / 3| = |3 - 5| = 2。
- 索引值 3 的平均差為:|(2 + 5 + 3 + 9) / 4 - (5 + 3) / 2| = |19 / 4 - 8 / 2| = |4 - 4| = 0。
- 索引值 4 的平均差為:|(2 + 5 + 3 + 9 + 5) / 5 - 3 / 1| = |24 / 5 - 3 / 1| = |4 - 3| = 1。
- 索引值 5 的平均差為:|(2 + 5 + 3 + 9 + 5 + 3) / 6 - 0| = |27 / 6 - 0| = |4 - 0| = 4。

而我們從中擷取「左側」和「右側」:
- 索引值 0 的左側和右側分別為:[2] 和 [5, 3, 9, 5, 3]
- 索引值 1 的左側和右側分別為:[2, 5] 和 [3, 9, 5, 3]
- 索引值 2 的左側和右側分別為:[2, 5, 3] 和 [9, 5, 3]
- 索引值 3 的左側和右側分別為:[2, 5, 3, 9] 和 [5, 3]
- 索引值 4 的左側和右側分別為:[2, 5, 3, 9, 5] 和 [3]
- 索引值 5 的左側和右側分別為:[2, 5, 3, 9, 5, 3] 和 []

可以看到一開始 nums[0] 的左側只有 nums[0] 自身,剩下的都是右側;而其後當我們從 nums[i] 變成 nums[i + 1] 時,左側將多出 nums[i]、而右側則少掉 nums[i]。

因此我們便可以按照這個方式將索引值 i 的左側和右側各自的數值總和轉變成索引值 i + 1 的左側右側各自的數值總和。而要得出左側的平均只要除以 i + 1、右側的平均只要除以 n - i - 1 即可(注意 n - i - 1 可能為 0,此時因為沒有任何元素所以平均為 0)。

接著只要掃過一次便可以知道哪個索引值得到的平均差最小。




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

創作回應

追蹤 創作集

作者相關創作

更多創作