小於K的兩數之和

給你一個整數數組 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;
}
相關文章
相關標籤/搜索