前往
大廳
主題

LeetCode - 2367. Number of Arithmetic Triplets 解題心得

Not In My Back Yard | 2023-06-25 12:00:08 | 巴幣 0 | 人氣 134

題目連結:


題目意譯:
你被給定一個索引值從 0 開始,且嚴格遞增的整數 nums,並給定一正整數 diff。一個三元對 (i, j, k) 如果滿足以下條件,則為一個等差三元對:
i < j < k,
nums[j] - nums[i] == diff,且
nums[k] - nums[j] == diff。

回傳 nums 中等差三元對的數量。

限制:
3 ≦ nums.length ≦ 200
0 ≦ nums[i] ≦ 200
1 ≦ diff ≦ 50
nums 為嚴格遞增的。



範例測資:
範例 1:
輸入: nums = [0,1,4,6,7,10], diff = 3
輸出: 2
解釋:
(1, 2, 4) 是一個等差三元對,因為 7 - 4 == 3 和 4 - 1 == 3。
(2, 4, 5) 是一個等差三元對,因為 10 - 7 == 3 和 7 - 4 == 3。

範例 2:
輸入: nums = [4,5,6,7,8,9], diff = 2
輸出: 2
解釋:
(0, 2, 4) 是一個等差三元對,因為 8 - 6 == 2 and 6 - 4 == 2。
(1, 3, 5) 是一個等差三元對,因為 9 - 7 == 2 and 7 - 5 == 2。


解題思維:
由於 nums 是嚴格遞增的,因此:
令 x = nums[0] 、 y = x + diff 、 z = x + 2 × diff。一個三元對

則我們掃過 nums 來找 y 和 z 時,只需要針對每一個索引值 i 然後檢查看看 nums[i] 有沒有小於 y 即可,如果是就繼續將 i 加 1 直到不符合為止(此時不代表 nums[i] == y);而 z 的位置只需要從 i 往後繼續找即可,條件也是類似的(稱其索引值為 j)。

因此我們只要判斷 nums[i] 是否恰好為 y 且 nums[j] 是否恰好為 z,即可知道以索引值 0 作為三元對第一個元素的數對是否存在。

而當我們移到下一個索引值,然後令 x' = nums[1] 、 y' = x' + diff 、 z' = x' + 2 × diff 並要去 nums 找 y' 和 z' 時,我們實際上可以從前一次的索引值 i 和 j 出發(即 y' 最小可能所在位置 i' 至少是 i + 1;z' 的 j' 也是同理)。

而再下一個開頭(nums[2])也可以繼續繼承 i' 和 j' 的位置繼續找,以此類推。

因此可以看到我們窮舉了開頭,而剩下的兩種索引值(i 、 i' 、……一種以及 j 、 j' 、……另一種)也只會往右移動,因此時間複雜度為 O(n),其中 n 為 nums 之元素個數。

而所求即為窮舉過程中,符合條件的三元對之數量。




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

創作回應

更多創作