ETH官方钱包

前往
大廳
主題

LeetCode - 1814. Count Nice Pairs in an Array 解題心得

Not In My Back Yard | 2024-02-11 12:00:01 | 巴幣 0 | 人氣 80

題目連結:


題目意譯:
你被給定一陣列 nums,其由非負整數所組成。讓我們定義 rev(x) 為一個非負整數 x 的反轉數字。例如說,rev(123) = 321,而 rev(120) = 21。一個索引值對 (i, j) 如果滿足以下所有條件,則其將被視為是「很棒的」:
    0 ≦ i < j < nums.length
    nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])

回傳很棒的索引值對之數量。由於答案可能很大,將其模 10 ^ 9 + 7 後再回傳。

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



範例測資:
範例 1:
輸入: nums = [42,11,1,97]
輸出: 2
解釋: 這兩個數對為:
- (0,3) : 42 + rev(97) = 42 + 79 = 121, 97 + rev(42) = 97 + 24 = 121。
- (1,2) : 11 + rev(1) = 11 + 1 = 12, 1 + rev(11) = 1 + 11 = 12。

範例 2:
輸入: nums = [13,10,35,24,76]
輸出: 4


解題思維:
首先,我們把原式的
nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])
移項得到
nums[i] - rev(nums[i]) == nums[j] - rev(nums[j])
可以看到等號兩邊各自只包含著一個數字,而這些數值可以事先掃過一次 nums 來計算出來。

而如果現在有 C 個數字計算它們對應的 nums[i] - rev(nums[i]) 之值會是 X。則對於 X 來說,我們會有 C × (C - 1) ÷ 2 對索引值對滿足條件。因此實際上我們要看的是每一種這樣子的數值中各自有多少索引值對,而這些對數之總和即是所求。




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

創作回應

更多創作