給你一個整數數組 A
和一個整數 K
,請在該數組中找出兩個元素,使它們的和小於 K
但儘量地接近 K
,返回這兩個元素的和。數組
如不存在這樣的兩個元素,請返回 -1
。指針
示例1:code
輸入:A = [34,23,1,24,75,33,54,8], K = 60
輸出:58
解釋:
34 和 24 相加獲得 58,58 小於 60,知足題意。blog
示例2:排序
輸入:A = [10,20,30], K = 15
輸出:-1
解釋:沒法找到和小於 15 的兩個元素class
思路:循環
首先對數組進行排序。而後左指針指向第一個元素,右指針指向第二個元素。將左指針和右指針對應的值相加,若是>=K,則右指針移動一位。若是小於K,則左指針移動一位。sort
例子:移動
數組:K=60di
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; }