雙周賽88。要不是Q1罰我15分鐘,本來應該會有400名左右,可惜了。Q1被rejudge掉,噴到1800名,好慘。

題目

輸入兩個長度為n的整數陣列nums1和nums2,以及一個整數diff。
找到符合以下規則的數對(i, j):

  • 0 <= i < j <= n - 1
  • nums1[i] - nums1[j] <= nums2[i] - nums2[j] + diff

返回滿足條件的對數。

解法

原來這條公式需要列舉出i,j才能算出是否合法,非常難處理,但只要進行移項就會簡化很多。

nums1[i] - nums1[j] <= nums2[i] - nums2[j] + diff
移項把i和j放到同一邊
nums1[i] - nums2[i] <= nums1[j] - nums2[j] + diff

因為i一定小於j,所以從小到大列舉j時,先前出現過的索引都可以做為i。直接用二分搜找到有多少i可以使等式成立,根據乘法公式加入答案裡面即可。

from sortedcontainers import SortedList
class Solution:
    def numberOfPairs(self, nums1: List[int], nums2: List[int], diff: int) -> int:
        sl=SortedList()
        ans=0
        
        for n1,n2 in zip(nums1,nums2):
            target=n1-n2+diff
            idx=sl.bisect_right(target)
            ans+=idx
            sl.add(n1-n2)
            
        return ans