Skip to content

Commit a358654

Browse files
authored
Create 2040.Kth-Smallest-Product-of-Two-Sorted-Arrays.cpp
1 parent dcacfa5 commit a358654

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using LL = long long;
2+
class Solution {
3+
public:
4+
long long kthSmallestProduct(vector<int>& nums1, vector<int>& nums2, long long k)
5+
{
6+
if (nums1.size() > nums2.size())
7+
return kthSmallestProduct(nums2, nums1, k);
8+
9+
LL left = -1e10, right = 1e10;
10+
while (left < right)
11+
{
12+
LL mid = left+(right-left)/2;
13+
if (checkNums(mid, nums1, nums2) >= k)
14+
right = mid;
15+
else
16+
left = mid+1;
17+
}
18+
return left;
19+
}
20+
21+
LL checkNums(LL mid, vector<int>& nums1, vector<int>& nums2)
22+
{
23+
LL ret = 0;
24+
for (int i=0; i<nums1.size(); i++)
25+
{
26+
LL x = nums1[i];
27+
28+
if (x == 0)
29+
{
30+
if (mid < 0) ret+=0;
31+
else ret+=nums2.size();
32+
}
33+
else if (x > 0)
34+
{
35+
LL yy = floor(mid*1.0/x);
36+
auto iter = upper_bound(nums2.begin(), nums2.end(), yy);
37+
ret += (iter-nums2.begin());
38+
}
39+
else
40+
{
41+
LL yy = ceil(mid*1.0/x);
42+
auto iter = lower_bound(nums2.begin(), nums2.end(), yy);
43+
ret += nums2.size() - (iter-nums2.begin());
44+
}
45+
}
46+
47+
return ret;
48+
}
49+
};

0 commit comments

Comments
 (0)