给你一个整数数组 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 的两个元素。
代码分析,设置两个号类似于指针的左右游标,然后让左右两个数相加,如果大的话右边的往左移动(前提是数组是已经排好序的),如果小于给定值,那么左边的往右移动,让一个临时变量temp记录result的临时值,最终跳出循环条件得出结果
示例1代码如下
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
int a[8] = { 34,23,1,24,75,33,54,8 };
sort(a, a + 8);
int K;
cin >> K;
int length = sizeof(a) / sizeof(a[0]);
int l = 0, r = length - 1;
int temp = -1, result = -1;//用来记录临时的result
if (length == 0 || a == NULL)
return -1;
while (l < r)
{
if (a[l] + a[r] >= K)
r--;
else
{
result = a[l] + a[r];
l++;
}
if (temp < result && result < K)
temp = result;
}
cout << temp;
return 0;
}
示例2代码如下
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
int a[3] = { 10,20,30 };
sort(a, a + 3);
int K;
cin >> K;
int length = sizeof(a) / sizeof(a[0]);
int l = 0, r = length - 1;
int temp = -1, result = -1;//用来记录临时的result
if (length == 0 || a == NULL)
return -1;
while (l < r)
{
if (a[l] + a[r] >= K)
r--;
else
{
result = a[l] + a[r];
l++;
}
if (temp < result && result < K)
temp = result;
}
cout << temp;
return 0;
}
其实代码都差不多,我发两遍的原因是,当时第二遍改的时候忘了改sort里 的参数导致一直出不来正确结果,突然恍然大悟,而且发出来这个是已经修改的,最先的代码没有判断示例2的功能。