Java | Leetcode Java题解之第373题查找和最小的K对数字

devtools/2024/9/22 17:42:09/

题目:

题解

class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {int m = nums1.length;int n = nums2.length;/*二分查找第 k 小的数对和的大小*/int left = nums1[0] + nums2[0];int right = nums1[m - 1] + nums2[n - 1];int pairSum = right;while (left <= right) {int mid = left + ((right - left) >> 1);long cnt = 0;int start = 0;int end = n - 1;while (start < m && end >= 0) {if (nums1[start] + nums2[end] > mid) {end--;} else {cnt += end + 1;start++;}}if (cnt < k) {left = mid + 1;} else {pairSum = mid;right = mid - 1;}}List<List<Integer>> ans = new ArrayList<>();int pos = n - 1;/*找到小于目标值 pairSum 的数对*/for (int i = 0; i < m; i++) {while (pos >= 0 && nums1[i] + nums2[pos] >= pairSum) {pos--;}for (int j = 0; j <= pos && k > 0; j++, k--) {List<Integer> list = new ArrayList<>();list.add(nums1[i]);list.add(nums2[j]);ans.add(list);}}/*找到等于目标值 pairSum 的数对*/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] > pairSum) {pos--;}int start2 = pos;while (pos > 0 && nums2[pos] == nums2[pos - 1]) {pos--;}if (nums1[i] + nums2[pos] != pairSum) {continue;}int count = (int) Math.min(k, (long) (i - start1 + 1) * (start2 - pos + 1));for (int j = 0; j < count && k > 0; j++, k--) {List<Integer> list = new ArrayList<>();list.add(nums1[i]);list.add(nums2[pos]);ans.add(list);}}return ans;}
}

http://www.ppmy.cn/devtools/99773.html

相关文章

ProtoBuf简要介绍与快速上手使用(C++版)

文章目录 一、 初识ProtoBuf1. 序列化和反序列化概念2. ProtoBuf是什么3. ProtoBuf的使用特点 二、 讲解说明三、 快速上手1. 创建 .proto 文件2. 编译 contacts.proto 文件&#xff0c;生成C文件3. 序列化与反序列化的使用4. 小结 ProtoBuf 使用流程 一、 初识ProtoBuf 1. 序…

curl 无法访问 download.docker.com 的问题的解决方法

一. 问题 在按照 Docker Standalone | SigNoz 中的说明安装SigNoz之时出现下面的输出&#xff1a; $ ./install.sh &#x1f44b; Thank you for trying out SigNoz! &#x1f7e1; Running installer with non-sudo permissions.In case of any failure or prompt, please…

深入理解二叉树层级遍历与应用:从基础到进阶

深入理解二叉树层级遍历与应用&#xff1a;从基础到进阶 在数据结构与算法的学习中&#xff0c;二叉树的遍历是一个关键主题&#xff0c;尤其是层级遍历&#xff08;广度优先搜索&#xff0c;BFS&#xff09;。本文将深入探讨二叉树的层级遍历&#xff0c;并在此基础上进行扩展…

常见分布式ID解决方案的优缺点

分布式系统之所以难,很重要的原因之一是“没有一个全局时钟,难以保证绝对的时序”。 一、分布式ID的特性或要求: 唯一性:确保生成的ID是应用系统内唯一。高可用性:确保任何时候都能正确的生成ID。有意义:或者说包含更多信息,例如时间、业务等信息。如:有序性,通常都需…

基于cubemx的STM32的freertos的串口通信

1、任务描述 使用freertos系统实现电脑调试助手和正点原子开发板STM32F103ZET6的串口通信。 2、cubemx设置 3、程序代码 &#xff08;1&#xff09;添加usart1.c #include "usart1.h"#include "usart.h"/**********重定义函数**********/struct __FILE …

C++面试基础系列-macro_definition宏定义

系列文章目录 文章目录 系列文章目录C面试基础系列-macro_definition宏定义Overview1.宏定义的概念1.1. 基本宏定义1.2. 带参数的宏1.3. 条件编译1.4. 宏的展开1.5. 宏的副作用1.6. 宏与类型1.7. 宏的撤销1.8. 宏的可见性1.9. 避免宏冲突1.10. 宏与函数的区别1.11. 字符串化操作…

Rust: 技术介绍

简介 Rust是一门由Mozilla基金会开发的系统编程语言&#xff0c;其设计目标是在保证内存安全的同时提供高性能和并发编程能力。Rust的出现旨在解决C和C等语言在内存管理方面的复杂性&#xff0c;同时保持与这些语言相近的性能水平。下面&#xff0c;我们将从Rust的基础使用、高…

SSRF以及CSRF

ssrf 服务端请求伪造&#xff1a;由于服务端提供了从其他服务器应用获取数据的功能&#xff0c;但又没有对目标地址做严格过滤与限制&#xff0c;导致攻击者可以传入任意的地址来让后端服务器对其发起请求&#xff0c;并返回对该目标地址请求的数据 数据流&#xff1a;攻击者…