给你一个整数数组 A 和一个整数 K,请在该数组中找出两个元素,使它们的和小于 K但尽可能地接近 K返回这两个元素的和

如不存在这样的两个元素,请返回 -1

示例1:

输入:A = [34,23,1,24,75,33,54,8], K = 60
输出:58
解释:
34 和 24 相加得到 58,58 小于 60,满足题意。

示例2:

输入:A = [10,20,30], K = 15
输出:-1
解释:无法找到和小于 15 的两个元素

思路:

首先对数组进行排序。然后左指针指向第一个元素,右指针指向第二个元素。将左指针和右指针对应的值相加,如果>=K,则右指针移动一位。如果小于K,则左指针移动一位。

例子:

数组:K=60

1,8,33,54,23,34,24,75

排序后:

1 8 23 24 33 34
54 75

L                              R

1+75>K,R移动一位

1 8 23 24 33 34
54 75

L                         R

1+54 < K,L移动一位,此时记录sum=55

1 8 23 24 33 34
54 75

L                      R

8+54 > K, R移动一位

1 8 23 24 33 34
54 75

L                 R

8+34 < K,L移动一位

1 8 23 24 33 34
54 75

L              R

23+34 < K,L移动一位。此时的值为57>sum,因此sum更新为57

1 8 23 24 33 34
54 75

L        R

24+34 < K, L移动一位,此时值为58大于sum,sum更新为58

1 8 23 24 33 34
54 75

L   R

33+34 > K,R 移动一位,此时L=R,退出循环。最终得到的sum值为58

对应代码如下:

void insert_sort(int arrary[],int len)
{
int i, j;
int temp;
for (i = 1; i < len; i++)
{
j = i;
while (j > 0 && arrary[j] < arrary[j - 1])
{
temp = arrary[j];
arrary[j] = arrary[j - 1];
arrary[j - 1] = temp;
j--;
}
}
}
int TwoSumLessThanK(int a[], int len,int k)
{
int left, right,sum;
left = 0;
right = len-1;
insert_sort(a, len);
//初始化sum等于排序后的第一个值,也就是最小的值
sum = a[left];
while (left < right)
{
if (a[left] + a[right] < k)
{
sum = a[left] + a[right] > sum ? a[left] + a[right] : sum;
left += 1;
}
else
{
right -= 1;
}
}
//如果sum值一直等于初始值,证明不存在这样的两个元素,则返回-1
return sum == a[left]?-1:sum;
}

  

小于K的两数之和的更多相关文章

  1. 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

    题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的 ...

  2. 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数

    问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...

  3. 【LeetCode】 两数之和 twoSum

    两数之和 (简单) 题目描述 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数: 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 例如: 给定 nums = [2,7,11, ...

  4. LeetCode:两数之和、三数之和、四数之和

    LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...

  5. LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  6. [LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树

    Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...

  7. Leetcode 167. 两数之和 II - 输入有序数组 By Python

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  8. LeetCode 167. 两数之和 II - 输入有序数组

    题目: 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的 ...

  9. 领扣-1/167 两数之和 Two Sum MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. DT系统开发之-在线询盘信息的调取实现

    调用标签 <!--{tag("table=message&condition=status=3 and typeid=1&areaid=$cityid&cati ...

  2. Gradle 学习资料

    Gradle 学习资料 网址 Gradle 使用指南 http://wiki.jikexueyuan.com/project/gradle/ 寄Android开发Gradle你需要知道的知识 http ...

  3. 20180520模拟赛T1——math

    [问题描述] 小美有 n 个点 m 条边. 让你给每个点一个正整数编号. 每条边有两个属性,相连的两个点的编号的 GCD 和 LCM. 题目保证整张图连通. 让你构造出一个编号. [输入格式] 从文件 ...

  4. modbus-poll和modbus-slave工具的学习使用——modbus协议功能码3的解析(及欧姆龙温控器调试笔记)

    最近的项目中使用到了欧姆龙的温控器,里面有很多的通信方式,我们使用的常见的modbus——RTU方式,其他方式我们不使用,其中通信手册上面有很多通信的实例,欧姆龙modbus还区分4字节模式和2字节模 ...

  5. spring、springMvc、springBoot和springCloud的联系与区别

    spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc).业务层(Ioc) ...

  6. 因子分解机 FM

    特征组合 人工方式的特征工程,通常有两个问题: 特征爆炸 大量重要的特征组合都隐藏在数据中,无法被专家识别和设计 针对上述两个问题,广度模型和深度模型提供了不同的解决思路. 广度模型包括FM/FFM等 ...

  7. 小说美句摘抄&&动漫壁纸

    不知道为啥脑子一抽打算开个坑(反正咱是个不务正业的人) 大部分是网文里的,某些是轻小说里的,文学名著--咱也不像会看那个的人啊-- upd 2019.11.6:把一些自己觉得好的动漫壁纸贴一贴,图床用 ...

  8. allure 2

    项目地址 https://github.com/allure-framework/allure2/releases 安装文档 https://docs.qameta.io/allure/#_insta ...

  9. cocos Uniforms值的赋值

    cocos Uniforms值的赋值 举个void Renderer::drawBatchedTriangles()的渲染: //Start drawing verties in batch for( ...

  10. 记一次MyBatisPlus问题(如果表名是数据库关键字怎么办)

    问题信息:如果表名是数据库关键字怎么办? 正常来说,如果是我们自己写sql的话,给表名加反引号即可解决问题. 但是由于我们使用MyBatisPlus,相关的sql基本上都是封装并自动生成的.如果是这种 ...