当前位置: 首页 > news >正文

【二分查找】力扣373. 查找和最小的 K 对数字

给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。

请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。

示例 1:
输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

示例 2:
输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1]
解释: 返回序列中的前 2 对数:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

在这里插入图片描述

二分

class Solution {
public:vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {int m = nums1.size();int n = nums2.size();auto count = [&](int target){int start = 0;int end = n - 1;long long cnt = 0;while(start < m && end >= 0){if(nums1[start] + nums2[end] > target){end--;}else{cnt += end + 1;start++;}}return cnt;};int left = nums1[0] + nums2[0];int right = nums1[m-1] + nums2[n-1];while(left < right){int mid = (left + right) >> 1;if(count(mid) < k){left = mid + 1;}else{right = mid;}}vector<vector<int>> ans;int pos = n - 1;for(int i = 0; i < m; i++){while(pos >= 0 && nums1[i] + nums2[pos] >= left){pos--;}for(int j = 0; j <= pos && k > 0; k--, j++){ans.push_back({nums1[i], nums2[j]});}}pos = n - 1;for(int i = 0; i < m && k > 0; i++){int start1 = i;while(i < m - 1 && nums1[i] == nums1[i+1]){i++;}while(pos >= 0 && nums1[i] + nums2[pos] > left){pos--;}int start2 = pos;while(pos > 0 && nums2[pos] == nums2[pos-1]){pos--;}if(nums1[i] + nums2[pos] != left){continue;}int count = min((long)k, (long)(i - start1 + 1) * (start2 - pos + 1));for(int j = 0; j < count && k > 0; j++, k--){ans.push_back({nums1[i], nums2[pos]});}}return ans;}
};

使用二分法实际上就是另外一种使用试探的方式。nums1[0] + nums2[0]是两个数组元素和的最小值,组成二分下界,nums1[m-1] + nums2[n-1]组成二分上界。我们使用二分查找,查找出当和为多少的时候,刚好是第k对数字。

我们定义一个count函数,count函数的目的实际上就是计算出小于等于我们传入的mid的组合一共有多少个,以便与k进行比较,从而找出我们最终需要的和是多少。

最终二分查找结束,left便是和第k小的元素对的和。由于我们最终要返回的是前k小的所有的数组对。那么我们在代码中首先先要找出和比left小的数组对是什么。

vector<vector<int>> ans;int pos = n - 1;for(int i = 0; i < m; i++){while(pos >= 0 && nums1[i] + nums2[pos] >= left){pos--;}for(int j = 0; j <= pos && k > 0; k--, j++){ans.push_back({nums1[i], nums2[j]});}}

接下来我们要查找出和等于left的元素对

pos = n - 1;for(int i = 0; i < m && k > 0; i++){int start1 = i;while(i < m - 1 && nums1[i] == nums1[i+1]){i++;}while(pos >= 0 && nums1[i] + nums2[pos] > left){pos--;}int start2 = pos;while(pos > 0 && nums2[pos] == nums2[pos-1]){pos--;}if(nums1[i] + nums2[pos] != left){continue;}int count = min((long)k, (long)(i - start1 + 1) * (start2 - pos + 1));for(int j = 0; j < count && k > 0; j++, k--){ans.push_back({nums1[i], nums2[pos]});}}

最后返回ans即是答案

相关文章:

【二分查找】力扣373. 查找和最小的 K 对数字

给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 示例 1: 输入: nums1 [1,7,11], nums2 …...

池化层Pooling Layer

1. 定义 池化是对特征图进行的一种压缩操作&#xff0c;通过在一个小的局部区域内进行汇总统计&#xff0c;用一个值来代表这个区域的特征信息&#xff0c;常用于卷积神经网络&#xff08;CNN&#xff09;中。 2. 作用 提取代表性信息的同时降低特征维度&#xff0c;具有平移…...

力扣算法题——11.盛最多水的容器

目录 &#x1f495;1.题目 &#x1f495;2.解析思路 本题思路总览 借助双指针探索规律 从规律到代码实现的转化 双指针的具体实现 代码整体流程 &#x1f495;3.代码实现 &#x1f495;4.完结 二十七步也能走完逆流河吗 &#x1f495;1.题目 &#x1f495;2.解析思路…...

自由学习记录(32)

文件里找到切换颜色空间 fgui中的 颜色空间是一种总体使用前的设定 颜色空间&#xff0c;和半透明混合产生的效果有差异&#xff0c;这种问题一般可以产生联系 动效就是在fgui里可以编辑好&#xff0c;然后在unity中也准备了对应的调用手段&#xff0c;可以详细的使用每一个具…...

VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)

使用VSCode编辑出现Recipe terminated with fatal error: spawn xelatex ENOENT问题咋办&#xff1f; 很好解决&#xff0c;大概率的原因是因为latex没有添加到系统环境变量中&#xff0c;所有设置的编译工具没有办法找到才出现的这种情况。 解决方法&#xff1a; winR 然后输…...

「蓝桥杯题解」蜗牛(Java)

题目链接 这道题我感觉状态定义不太好想&#xff0c;需要一定的经验 import java.util.*; /*** 蜗牛* 状态定义&#xff1a;* dp[i][0]:到达(x[i],0)最小时间* dp[i][1]:到达 xi 上方的传送门最小时间*/public class Main {static Scanner in new Scanner(System.in);static f…...

PHP EOF (Heredoc) 详解

PHP EOF (Heredoc) 详解 PHP 中的 EOF(End Of File)是一种非常有用的语法特性,允许开发者创建多行字符串。它特别适合于创建格式化文本,如配置文件、HTML 模板等。本文将详细讲解 PHP EOF 的用法、优势以及注意事项。 什么是 EOF? EOF 是一种特殊的字符串定义方式,它允…...

pyautogui操控Acrobat DC pro万能PDF转Word,不丢任何PDF格式样式

为了将PDF转换脚本改为多进程异步处理&#xff0c;我们需要确保每个进程独立操作不同的Acrobat窗口。以下是实现步骤&#xff1a; 实现代码 import os import pyautogui import time import subprocess import pygetwindow as gw from multiprocessing import Pooldef conver…...

Day32:字符串的复制

在 Python 中&#xff0c;字符串的复制是指创建一个新的字符串&#xff0c;它的内容与原字符串相同。字符串是不可变的对象&#xff0c;这意味着你不能直接修改字符串的内容&#xff0c;但是可以通过复制来创建新的字符串进行操作。字符串的复制在一些情况下非常有用&#xff0…...

基于Mybatis继承AbstractRoutingDataSource使用自定义注解实现动态数据源

一&#xff1a;实现 方式一&#xff1a;继承AbstractRoutingDataSource使用自定义注解实现 环境&#xff1a;springboot3 MyBatis3 mysql-connector8 DataSourceKeyEnum枚举类 有几个数据源就配置几个枚举类&#xff0c;和数据源数量一一对应 class DataSourceKeyEnum{D…...

ZooKeeper 数据模型

ZooKeeper 数据模型 ZooKeeper 拥有层次化的命名空间&#xff0c;类似分布式文件系统&#xff0c;但每个节点不仅能有子节点&#xff0c;还可关联数据。节点路径为规范的绝对路径&#xff0c;用斜杠分隔&#xff0c;无相对引用。路径命名有如下约束&#xff1a; 路径名不能包…...

【VUE】Vue2中Vue.extend方法

在 Vue.js 2.x 版本中&#xff0c;Vue.extend() 方法被用于创建一个新的 Vue 子类&#xff0c;可以在该子类上扩展一些属性、指令和组件选项等&#xff0c;然后进行实例化。 比如&#xff0c;可以在创建一些类似 loading 式的函数式插件时&#xff0c;使用&#xff1a; 在 Vue…...

MaskGAE论文阅读

What’s Behind the Mask: Understanding Masked Graph Modeling for Graph Autoencoders 碎碎念&#xff1a;一篇论文看四天&#xff0c;效率也没谁了(捂脸) 看一点忘一点&#xff0c;虽然在本子上有记录&#xff0c;但还是忘&#xff0c;下次看一点在博客上记一点启发 本来很…...

Mybatis-plus 更新 Null 的策略踩坑记

一个bug 在一个管理页面&#xff0c;有一个非必填字段被设置成空了并提交更新&#xff0c;再次打开的时候&#xff0c;发现字段还在&#xff0c;并没有被更新成功。 使用的数据库映射框架是 Mybatis-plus &#xff0c;对于Mybatis 在更新字段的时候会对空进行校验&#xff0c;…...

Oracle迁移DM数据库

Oracle迁移DM数据库 本文记录使用达梦官方数据迁移工具DTS&#xff0c;将Oracle数据库的数据迁移至达梦数据库。 1 数据准备 2 DTS工具操作步骤 2.1 创建工程 打开DTS迁移工具&#xff0c;点击新建工程&#xff0c;填写好工程信息&#xff0c;如图&#xff1a; 2.2 新建迁…...

HTML特殊符号的使用示例

目录 一、基本特殊符号的使用 1、空格符号&#xff1a; 2、小于号 和 大于号&#xff1a; 3、引号&#xff1a; 二、版权、注册商标符号的使用 1、版权符号&#xff1a;© 2、注册商标符号&#xff1a; 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…...

数据结构基础之《(15)—排序算法小结》

一、排序算法的稳定性 1、稳定性是指同样大小的样本再排序之后不会改变相对次序 2、对基础类型来说&#xff0c;稳定性毫无意义 比如&#xff1a;3和3没有区别。《潜伏》里说同样两个一百元大钞&#xff0c;你能告诉我哪一个是高尚的那一个是龌龊的么 3、对非基础类型来说&a…...

Linux系统下速通stm32的clion开发环境配置

陆陆续续搞这个已经很久了。 因为自己新电脑是linux系统无法使用keil&#xff0c;一开始想使用vscode里的eide但感觉不太好用&#xff1b;后面想直接使用cudeide但又不想妥协&#xff0c;想趁着这个机会把linux上的其他单片机开发配置也搞明白&#xff1b;而且非常想搞懂cmake…...

【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾

我的2024年创作之旅&#xff1a;从C语言到人工智能&#xff0c;个人成长与突破的全景回顾 引言 回望2024年&#xff0c;我不仅收获了技术上的成长&#xff0c;更收获了来自CSDN平台上无数粉丝、朋友以及网友们的支持与鼓励。在这条创作之路上&#xff0c;CSDN不仅是我展示技术成…...

Python 轻松扫描,快速检测:高效IP网段扫描工具全解析

Python 轻松扫描&#xff0c;快速检测&#xff1a;高效IP网段扫描工具全解析 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着…...

【深伪检测】论文整体调研与梳理方法

一、单篇论文精读&#xff1a;抓核心信息&#xff08;先“拆”后“懂”&#xff09; 每篇论文都要完成「标题→摘要→引言→方法→实验→相关工作」的递进式阅读&#xff0c;目的是精准捕捉“这篇论文在解决什么问题、用了什么方法、做出了什么贡献”。标题摘要&#xff08;10分…...

如何利用 SEO 工具提取网站的外部链接

如何利用 SEO 工具提取网站的外部链接 在当今竞争激烈的网络环境中&#xff0c;外部链接&#xff08;即指向你网站的其他网站的链接&#xff09;已经成为提升网站搜索引擎排名的重要因素。利用 SEO 工具提取网站的外部链接&#xff0c;不仅能帮助你更好地了解你的网站链接情况…...

2026上海紧固件专业展6月24-26日国家会展中心(上海)举办

2026第十六届上海紧固件专业展&#xff08;Fastener Expo Shanghai 2026&#xff09;将于6月24日至26日在国家会展中心&#xff08;上海&#xff09;举办。本届展会围绕紧固件全产业链展开&#xff0c;涵盖紧固件成品、冷镦成型设备、模具耗材、检测包装、表面处理以及原材料供…...

基于51单片机的电子秤(4挡)proteus、原理图、流程图 1185-基于51单片机的电子秤...

基于51单片机的电子秤&#xff08;4挡&#xff09;proteus、原理图、流程图 1185-基于51单片机的电子秤&#xff08;4挡&#xff09;proteus、原理图、流程图、物料清单、仿真图、源代码 功能介绍&#xff1a; 1、基本部分 &#xff08;1&#xff09;称重范围用开关分为三挡&am…...

基于BiTCN - BiGRU的分类预测Matlab代码实践:新手友好指南

基于BiTCN-BiGRU分类 Matlab代码 基于双向时间卷积网络结合双向门控循环单元(BiTCN-BiGRU)的数据分类预测(可以更换为单、多变量时序预测/回归&#xff0c;)&#xff0c;Matlab代码&#xff0c;可直接运行&#xff0c;适合小白新手 程序已经调试好&#xff0c;无需更改代码替换…...

操作系统与数据库系统的核心知识点,属于计算机科学与技术专业(尤其是考研408统考或相关课程)的重点复习提纲

操作系统与数据库系统的核心知识点&#xff0c;属于计算机科学与技术专业&#xff08;尤其是考研408统考或相关课程&#xff09;的重点复习提纲。以下是对各部分的简明梳理与关键点说明&#xff1a; ✅ 死锁处理 预防&#xff1a;破坏死锁四个必要条件之一&#xff08;互斥、占…...

ChatGPT上车CarPlay:智能交互新突破与安全边界的平衡

ChatGPT集成CarPlay&#xff1a;行车途中的语音智能交互4月3日&#xff0c;OpenAI宣布ChatGPT正式获得苹果CarPlay系统的集成支持。这一更新让CarPlay用户能够在车载仪表盘界面直接通过语音与ChatGPT进行交互&#xff0c;实现了行车途中的免提提问与请求服务。该功能的实现得益…...

HarmonyOS 6学习:语音识别准确率提升与错误纠正方案

引言 在HarmonyOS 6应用开发中&#xff0c;语音识别能力已成为构建智能交互体验的核心技术。随着AI技术的快速发展&#xff0c;语音识别已广泛应用于教育、办公、智能家居等多个场景。然而&#xff0c;在实际开发过程中&#xff0c;开发者常面临一个普遍问题&#xff1a;语音识…...

「码动四季·开源同行」go实战案例:如何保证微服务实例资源安全?

今天我和你分享的是如何保证微服务实例资源安全的案例。在前文&#xff0c;我们实践了如何使用Go搭建一个基本的授权服务器&#xff0c;它的主要功能是颁发访问令牌和验证访问令牌的有效性。在统一认证与授权服务体系中&#xff0c;还存在资源服务器对用户数据进行保护&#xf…...

WindowResizer:打破窗口限制,实现Windows窗口自由调整的终极解决方案

WindowResizer&#xff1a;打破窗口限制&#xff0c;实现Windows窗口自由调整的终极解决方案 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾遇到过某些应用程序窗口大小被…...