文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给两个排序的数组。
从两个数组中各取取一个数,这两个数之和需要小于或等于k, 需要找到两数之和最大的索引组合。
返回一对包含两个列表的索引。
如果有多个两数之和相等的索引答案,你应该选择第一个数组索引最小的索引对。
在此前提下,你应该选择第二个数组索引最小的索引对。

1)两数的总和<= k
2)总和是最大的
3)两个数组索引都尽量最小

如果你无法找到答案,你应返回一个空列表[]。
You can assume that the numbers in arrays are all positive integer or zero.

示例1
输入:
A = [1, 4, 6, 9], B = [1, 2, 3, 4], K = 9
输出:
[2, 2]示例2:
输入:
A = [1, 4, 6, 8], B = [1, 2, 3, 5], K = 12
输出:
[2, 3]

https://tianchi.aliyun.com/oj/338592228998370026/357527484118536803

2. 解题

  • 遍历 B 的元素,记录每个值第一次出现的位置
  • 遍历 A,在 B 中查找小于等于 K-A[i] 的最大的数
  • 时间复杂度 O(n1log⁡n2)O(n_1\log n_2)O(n1​logn2​)
class Solution {public:/*** @param A: an integer sorted array* @param B: an integer sorted array* @param K: an integer* @return: return a pair of index*/vector<int> optimalUtilization(vector<int> &A, vector<int> &B, int K) {// write your code hereif(A.empty() || B.empty() || A[0]+B[0] > K) return {};unordered_map<int,int> m;for(int i = 0; i < B.size(); ++i)if(m.find(B[i]) == m.end())m[B[i]] = i;//每个数最早出现的位置int i = 0, j = B.size()-1, n1 = A.size(), n2 = B.size(), sum, maxsum=INT_MIN;vector<int> ans(2);for(int i = 0; i < n1; ++i){int t = K-A[i];int l = 0, r = n2-1, pos=-1;while(l <= r)    // 二分查找{int mid = l+((r-l)>>1);if(B[mid] > t)r = mid-1;else{if(mid==n2-1 || B[mid+1] > t){pos = mid;break;}elsel = mid+1;}}if(pos != -1){sum = A[i]+B[pos];if(sum > maxsum){maxsum = sum;ans[0] = i;ans[1] = m[B[pos]];}}elsebreak;}return ans;}
};

50ms C++


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

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

天池 在线编程 最佳利用率(二分查找 + 哈希)相关推荐

  1. 天池 在线编程 木材加工(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k. 当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头 ...

  2. 【组队学习】【34期】阿里云天池在线编程训练营

    阿里云天池在线编程训练营 航路开辟者:陈信达.杨世超.赵子一.马燕鹏 领航员:武帅.初晓宇.叶前坤.邱广坤.朱松青 航海士:宁彦吉.肖桐.汪超.陈信达.杨世超.赵子一.武帅.初晓宇.叶前坤.邱广坤.朱 ...

  3. 1.9 编程基础之二分查找 12 最长平台 python

    http://noi.openjudge.cn/ch0109/12/ """1.9 编程基础之二分查找 12 最长平台 http://noi.openjudge.cn/c ...

  4. 1.9 编程基础之二分查找 13:整数去重 python

    http://noi.openjudge.cn/ch0109/13/ """1.9 编程基础之二分查找 13:整数去重 http://noi.openjudge.cn/c ...

  5. 1.11 编程基础之二分查找 08 不重复地输出数 python

    http://noi.openjudge.cn/ch0111/08/ """ 1.11 编程基础之二分查找 08 不重复地输出数 http://noi.openjudge ...

  6. 【Cuda并行编程之一】二分查找的探究以及Cuda的简单实现相关面试题介绍

    最近开始复习基础找工作,二分查找算是最基本而且十分重要的算法了,现在完整的解析一下,作为后面复习只用.内容分为几个部分: 一.二分查找的基本过程 折半查找技术,又称为二分查找.它的前提条件是线性表中的 ...

  7. 天池 在线编程 求和查找

    文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/164427478262600292/204998627646706400 2. 解题 ...

  8. 天池 在线编程 订单分配(回溯)

    文章目录 1. 题目 2. 解题 1. 题目 描述 打车派单场景, 假定有N个订单,待分配给N个司机. 每个订单在匹配司机前,会对候选司机进行打分,打分的结果保存在N*N的矩阵score,其中scor ...

  9. 天池 在线编程 双向取数(博弈DP)

    文章目录 1. 题目 2. 解题 1. 题目 https://tianchi.aliyun.com/oj/245679029019779851/254275128279634585 有一个长度为n的数 ...

最新文章

  1. Three.js 入门示例
  2. eWebEditor不支持IE8的解决方法
  3. 快速排序 java导包_排序算法-快速排序(Java实现)
  4. Android之使用MediaPlayer和SurfaceView组件播放一个简单的视频
  5. java csv 双引号_Java-使用Scess编写CSV时从字符串类型数据中删除双引号
  6. With语句是什么?
  7. C++并发与多线程(二) 创建多个线程、数据共享问题分析、案例代码
  8. JMETER安装与配置教程
  9. 配置cfree 5 支持C++11
  10. java 时间换算_时间换算java实现
  11. Ubuntu下安装小企鹅fcitx输入法
  12. 什么是V2X?如何通过V2X技术实现5G智慧交通?
  13. python相关性分析模型,相关性分析原理及Python实战
  14. 基于python的文件加密传输_python 利用Crypto进行AES解密加密文件
  15. C语言变量常量,基本数据类型及数据类型转换详讲
  16. 关系型数据库与非关系型数据库的简介、对比和说明!!!
  17. 使用Qt获取系统版本
  18. 什么是缺陷密度?计算的公式及示例
  19. Bayesian Face Revisited: A Joint Formulation论文笔记
  20. 简单聊聊分布式系统架构

热门文章

  1. python3.7知识点汇总
  2. python金字塔_高斯金字塔与拉普拉斯金字塔的原理与python构建
  3. 数组拼接时中间怎么加入空格_【题解二维数组】1123:图像相似度
  4. qlabel可以选中吗_惊现凡尔赛式排版!原来微信公众号排版样式还可以“变装”?...
  5. 计算机在超声的应用,计算机在医学超声成像中应用.pdf
  6. Linux字符设备驱动剖析
  7. linux qt ping,Qt5.2中使用ping命令实现Ip扫描功能
  8. java与.net平台之间进行RSA加密验证
  9. zbb20180117 汉字转拼音 pinyin4
  10. [转]微信小程序登录逻辑梳理