LeetCode 每日一题 小于 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 的两个元素。

代码分析,设置两个号类似于指针的左右游标,然后让左右两个数相加,如果大的话右边的往左移动(前提是数组是已经排好序的),如果小于给定值,那么左边的往右移动,让一个临时变量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的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值