小于K的两数之和
给你一个整数数组 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的两数之和的更多相关文章
- 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的 ...
- 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数
问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...
- 【LeetCode】 两数之和 twoSum
两数之和 (简单) 题目描述 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数: 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 例如: 给定 nums = [2,7,11, ...
- LeetCode:两数之和、三数之和、四数之和
LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...
- 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 ...
- [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 ...
- Leetcode 167. 两数之和 II - 输入有序数组 By Python
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...
- LeetCode 167. 两数之和 II - 输入有序数组
题目: 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的 ...
- 领扣-1/167 两数之和 Two Sum MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- 为什么使用正则RegExp.test( )方法时第一次是 true,第二次是false?
今天朋友问我一个问题,我现在需要多次匹配同一个内容,但是为什么我第一次匹配,直接是 true,而第二次匹配确实 false 呢? var s1 = "MRLP"; var s2 = ...
- com.mysql.jdbc.MysqlDataTruncation: Data truncation异常
Exception in thread "main" com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too l ...
- Controller的激活(1)
Public interface IController { void Execute(RequestContext requestContext) } Public abstract Class C ...
- spark读写Oracle、hive的艰辛之路(二)-Oracle的date类型
近期又有需求为:导入Oracle的表到hive库中: 关于spark读取Oracle到hive有以下两点需要说明: 1.数据量较小时,可以直接使用spark.read.jdbc(orclUrl,tab ...
- pandas IO
pd.read_csv("../data/user_info.csv", index_col="name") #假设csv里包含这几列: name, age, ...
- runloop事件、UI更新、observer与coranimation
一.触摸事件派发与视图绘制打包 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ __dispatchPreprocessedEve ...
- jdk和Tomcat版本之间的关系,jdk尽量要比tomcat低才行
注:本文来源于:6860 <jdk和Tomcat版本之间的关系,jdk尽量要比tomcat低才行> 用的tomcat是低版本的,但是用的jdk却是高版本的,用Servlet做的项目运行都没 ...
- 【CSP-S膜你考】即时战略(模拟)
Problem B. 即时战略 (rts.c/cpp/pas) 注意 Input file: rts.in Output file: rts.out Time Limit : 2 seconds Me ...
- 【luoguP2989】[USACO10MAR]对速度的需要Need For Speed
题目描述 最大化平均值 二分一个\(x\) \(check\): \(\frac{F+\sum_{i=1}^{n} X_{i} \times F_{i}}{M+\sum_{i=1}^{n} X_{i} ...
- https与http的区别?
https要比http更加安全一些,也就是说http协议是由ssl+http协议构建的可进行加密传输.身份验证的网络协议要比http协议安全 现在大多数的网站都逐渐用https://,因为安全问题太重 ...