小于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
对应代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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--; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2017-10-10 一起来学linux:网络配置