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

提升网站响应时间西安seo网站排名

提升网站响应时间,西安seo网站排名,视频制作的基本流程是什么,装饰设计公司哪个好给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 示例 1: 输入: nums1 [1,7,11], nums2 …

给定两个以 非递减顺序排列 的整数数组 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即是答案

http://www.yidumall.com/news/90791.html

相关文章:

  • icons8seo三人行论坛
  • 汽车网站制作seo免费外链工具
  • 企业网站的建立与维护论文今日新闻播报
  • 疯狗做网站文山seo公司
  • 微友说是做网站维护让帮忙投注企业网络推广的方式有哪些
  • 珠海网站推广排名win优化大师官网
  • 青海网站制作公司常州谷歌优化
  • 学ui可以做网站么seo推广多少钱
  • php网站微信支付怎么做搜索引擎优化教材答案
  • 沈阳做网站seoseo系统
  • 创建虚拟网站做点击互联网营销师国家职业技能标准
  • 东莞手机网站设计公司落实20条优化措施
  • wordpress媒体库调用桂林seo
  • 广西网站开发全国疫情最新情况
  • 合肥网站建长沙网站托管seo优化公司
  • 重庆建设工程造价信息网站国外免费源码共享网站
  • 龙岗网站建设价格百度网页版浏览器入口
  • 阜阳营销型网站建设网站统计
  • 大型网购网站开发框架行者seo
  • 深圳外贸网页设计成都关键词优化报价
  • 北京教育云平台网站建设百度账号登陆
  • 南昌网站建设模板网络公司市场营销策划方案
  • 英国T4学生签证 可以做网站吗营销模式和营销策略
  • wordpress 被黑福州网seo
  • 个人网站上线流程安卓优化大师手机版
  • 广州营销型网站建设网站推广策划方案
  • 网站访问拒绝北京自动seo
  • 大浪网站建设网页设计与网站开发
  • 路由器做网站教程微信引流推广怎么找平台
  • 靠谱网站建设公司怎么选百度seo排名规则