```python
from typing import List
import bisect

class Solution:
    def kthSmallestProduct(self, nums1: List[int], nums2: List[int], k: int) -> int:
        # 统计乘积 <= mid 的个数
        def count(mid: int) -> int:
            cnt = 0
            for a in nums1:
                if a > 0:
                    # a * b <= mid  =>  b <= floor(mid / a)
                    target = mid // a
                    cnt += bisect.bisect_right(nums2, target)
                elif a < 0:
                    # a * b <= mid  =>  b >= ceil(mid / a) = ceil(-mid / -a)
                    a_pos = -a
                    target = (-mid + a_pos - 1) // a_pos   # 向上取整公式
                    cnt += len(nums2) - bisect.bisect_left(nums2, target)
                else:  # a == 0
                    if mid >= 0:
                        cnt += len(nums2)
            return cnt

        # 答案可能的最小值与最大值(四个角乘积的最值)
        cand = [
            nums1[0] * nums2[0],
            nums1[0] * nums2[-1],
            nums1[-1] * nums2[0],
            nums1[-1] * nums2[-1],
        ]
        left, right = min(cand), max(cand)

        # 二分搜索答案
        while left < right:
            mid = (left + right) // 2
            if count(mid) < k:
                left = mid + 1
            else:
                right = mid
        return left
```

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐