文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给你两个 从小到大排好序 且下标从 0 开始的整数数组 nums1 和 nums2 以及一个整数 k ,请你返回第 k (从 1 开始编号)小的 nums1[i] * nums2[j] 的乘积,其中 0 <= i < nums1.length 且 0 <= j < nums2.length

示例 1:
输入:nums1 = [2,5], nums2 = [3,4], k = 2
输出:8
解释:第 2 小的乘积计算如下:
- nums1[0] * nums2[0] = 2 * 3 = 6
- nums1[0] * nums2[1] = 2 * 4 = 8
第 2 小的乘积为 8 。示例 2:
输入:nums1 = [-4,-2,0,3], nums2 = [2,4], k = 6
输出:0
解释:第 6 小的乘积计算如下:
- nums1[0] * nums2[1] = (-4) * 4 = -16
- nums1[0] * nums2[0] = (-4) * 2 = -8
- nums1[1] * nums2[1] = (-2) * 4 = -8
- nums1[1] * nums2[0] = (-2) * 2 = -4
- nums1[2] * nums2[0] = 0 * 2 = 0
- nums1[2] * nums2[1] = 0 * 4 = 0
第 6 小的乘积为 0 。示例 3:
输入:nums1 = [-2,-1,0,1,2], nums2 = [-3,-1,2,4,5], k = 3
输出:-6
解释:第 3 小的乘积计算如下:
- nums1[0] * nums2[4] = (-2) * 5 = -10
- nums1[0] * nums2[3] = (-2) * 4 = -8
- nums1[4] * nums2[0] = 2 * (-3) = -6
第 3 小的乘积为 -6 。提示:
1 <= nums1.length, nums2.length <= 5 * 10^4
-10^5 <= nums1[i], nums2[j] <= 10^5
1 <= k <= nums1.length * nums2.length
nums1 和 nums2 都是从小到大排好序的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-product-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 二分查找答案 ans,检查两个数组组成的乘积 <= ans 的个数 ct 是否满足 k 个,具有单调性
class Solution {vector<int> neg, zero, pos; // 数组2拆分为三部分 - 0 +
public:long long kthSmallestProduct(vector<int>& nums1, vector<int>& nums2, long long k) {long long l = -1e10, r = 1e10, mid, ans;for(int i = 0; i < nums2.size(); ++i){if(nums2[i] < 0)neg.push_back(nums2[i]);else if(nums2[i] > 0)pos.push_back(nums2[i]);elsezero.push_back(nums2[i]);}while(l <= r) // 二分查找答案{mid = l+((r-l)>>1);long long ct = check(nums1, nums2, mid);if(ct >= k){ans = mid;r = mid-1;}elsel = mid+1;}return ans;}long long check(vector<int>& nums1, vector<int>& nums2, long long num){long long ct = 0; // 计算有多少数是小于等于 num 的for(auto a : nums1){if(a == 0){if(num >= 0)ct += nums2.size();}else if(a > 0){if(num == 0)ct += neg.size()+zero.size();else if(num > 0){auto x = upper_bound(pos.begin(), pos.end(), num/a);ct += x-pos.begin()+neg.size()+zero.size();}else{long long t = num%a ? num/a-1 : num/a;auto x = upper_bound(neg.begin(), neg.end(), t);ct += x-neg.begin();}}else // a < 0{if(num == 0)ct += pos.size()+zero.size();else if(num > 0){auto x = lower_bound(neg.begin(), neg.end(), num/a);ct += neg.end()-x+pos.size()+zero.size();}else{long long t = num%a ? num/a+1 : num/a;auto x = lower_bound(pos.begin(), pos.end(), t);ct += pos.end()-x;}}}return ct;}
};

1788 ms 91.9 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 2040. 两个有序数组的第 K 小乘积(嵌套二分查找)相关推荐

  1. O(logn)在两个有序数组找第k小的数

    我们有两个有序数组,A[1+n],B[1+n],下标从1开始. logn显然就是二分折半. 设la=1,ra=n,lb=1,rb=n; mida=(la+ra)/2,midb=(lb+rb)/2; 我 ...

  2. LeetCode——合并两个有序数组

    LeetCode--合并两个有序数组 题目描述: 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nu ...

  3. LeetCode——寻找两个有序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...

  4. leetcode 寻找两个有序数组的中位数 hard

    题目链接 这篇文章写得很全面:https://www.cnblogs.com/grandyang/p/4465932.html 摘抄如下: 这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为O ...

  5. 【Leetcode】两个有序数组,求第k大的数

    双指针: def func(num1,num2,k):i,j,n = 0,0,0while i<len(num1) or j<len(num2):n += 1if i<len(num ...

  6. LeetCode每日训练2—有序矩阵中第K小的元素(7.2)

    题目描述 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 示例: matrix = [ [ ...

  7. leetcode 寻找两个有序数组的中位数

    2085 / 2085 个通过测试用例 状态:通过 执行用时:4 ms 内存消耗:47.6 MB 提交时间:6 月,4 周之前 class Solution {public double findMe ...

  8. 求两个有序数组的中位数或者第k小元素

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 设两个数组分别是vec1和vec2,元素数目分别是n1.n2. 算法1:最简单的办法就是把两个数 ...

  9. [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)

    问题描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...

最新文章

  1. c++主线程等待子线程结束_简单明了的 Python 多线程来了 | 原力计划
  2. Python中字符串切片详解
  3. java 同步锁_java线程中的同步锁和互斥锁有什么区别?
  4. 关于cocopod命令
  5. 安装Hbase(分布式)遇到一些问题及解决方法
  6. maven tomcat插件_Maven技术01
  7. MongoDB复制集安全认证
  8. 一、kafka安装下载与kafka初步应用
  9. BZOJ1877 [SDOI2009]晨跑 【费用流】
  10. linux 解决Linux上解压jdk报错gzip: stdin: not in gzip format
  11. SQL2005开发版下载地址
  12. 打开要素类错误.几何形状数量与表的纪录数不匹配
  13. html 还原键盘默认事件,js阻止默认事件 (两种方法)及键盘事件onkeydown 、 onkeypress 、onkeyup实例讲解...
  14. python实现微信发送信息
  15. 【图像处理】PS曲线工具matlab实现 交互自定义灰度映射(Gray Level Transformation)附代码链接
  16. 《Java170道面试笔试题全面含答案》
  17. App UI交互与视觉设计
  18. arduino平衡车超声波_制作Arduino自平衡车(一)
  19. EPICS记录参考--Sequence记录(seq)
  20. 洛谷P1244青蛙过河

热门文章

  1. rhel mysql安装_RHEL6.4下MySQL安装方法及简单配置
  2. php 怎么从memcache缓存数据中统计某一字段总数,php和memcache统计在线人数的方法...
  3. 红黑树插入时的自平衡
  4. python实现Redis订阅发布
  5. Django Model设计详解
  6. android tee,Android 9.0的新增安全特性与TEE
  7. 驱动框架6——linux内核的gpiolib学习
  8. 使用VS2015编写C/C++开始步骤
  9. 2017 实习面试问题总结(阿里、头条、美团、cvte、乐视、华为)
  10. 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern