題目連結:
題目意譯:
你被給定一個索引值從 0 開始的整數陣列 nums。一對索引值 (i, j) 如果滿足 i < j 且 j - i != nums[j] - nums[i],則該對索引值為「壞配對」。
回傳 nums 中壞配對的數量。
限制:
1 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 9
範例測資:
範例 1:
輸入: nums = [4,1,3,3]
輸出: 5
解釋: 索引值對 (0, 1) 是一個壞配對,因為 1 - 0 != 1 - 4。
索引值對 (0, 2) 是一個壞配對,因為 2 - 0 != 3 - 4,2 != -1。
索引值對 (0, 3) 是一個壞配對,因為 3 - 0 != 3 - 4,3 != -1。
索引值對 (1, 2) 是一個壞配對,因為 2 - 1 != 3 - 1,1 != 2。
索引值對 (2, 3) 是一個壞配對,因為 3 - 2 != 3 - 3,1 != 0。
總計有 5 對壞配對,所以我們回傳 5。
範例 2:
輸入: nums = [1,2,3,4,5]
輸出: 0
解釋: 當中不存在壞配對。
解題思維:
把
j - i != nums[j] - nums[i]
根據等量公理,可以重新排列成
nums[i] - i != nums[j] - j
因此我們可以看到實際上要著重的部分是每個元素與其索引值相減之值。
也因此我們可以為每個元素 nums[i] 算出它們的 nums[i] - i 之值後,並把這些數值由小到大(或由大到?。┡判蛑嵋粯訑抵档木蜁墼谝黄?。
而由於壞配對牽扯到不同數值之間的數量統計,因此其實反過來計算「好」配對比較簡單(畢竟只要看單一數值有幾個而已)。因此我們就掃過這些排序後的「nums[i] - i」然後統計每一種數值有多少個(假設有 C 個),則該數值將會產生 C × (C - 1) ÷ 2 個好配對。
而最後只要把所有可能的配對數(即 n × (n - 1) ÷ 2,其中 n 為 nums 中的元素數量)減去所有好配對數量總數即可得到壞配對的數量。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。