给定一串递增数列,找到其中两个不同的数字 a[i] 和 a[j],使得a[i] + a[j] = k,并输出较小的那个数 如果有组a[i] 和 a[j] 满足条件,则输出其中数值最小的数,如果没有找到,输出-1
时间: 2023-04-28 16:03:10 浏览: 172
\u8fd9\u662f\u4e00\u4e2a\u7ed9\u5b9a\u4e00\u4e32\u6570\u5217\uff0c\u8981\u6c42\u51fa\u4e24\u4e2a\u4e0d\u540c\u7684\u6570\u5b57 a[i] \u548c a[j] \u4e3a\u4e00\u4e2a\u6570 k \u7684\u65b9\u6cd5\u3002
\u4e00\u4e2a\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\u662f\uff0c\u5c06\u6570\u5217\u8f6c\u6362\u6210\u4e00\u4e2a\u4ee5\u4e0b\u7684\u5bf9\u5e94\u5e76\u5bf9\u5e94\u6570\u503c\u7684 hashmap\uff1a
1. \u521b\u5efa\u4e00\u4e2a\u7a7a hashmap\u3002
2. \u9047\u5230\u6570\u5217\u4e2d\u7684\u6bcf\u4e2a\u6570\u5b57 a[i]\uff0c\u68c0\u67e5\u4e0b\u4e00\u4e2a\u6570\u5b57 k-a[i]\u662f\u5426\u5b58\u5728\u4e8e hashmap \u4e2d\uff0c\u5982\u679c\u5b58\u5728\uff0c\u5219\u8f93\u51fa a[i] \u548c k-a[i] \u7684\u503c\u3002
3. \u5982\u679c\u4e0d\u5b58\u5728\uff0c\u5219\u5c06 a[i] \u653e\u5165 hashmap \4e2d\uff0c\u7ee7\u7eed\u68c0\u67e5\u6570\u5217\u3002
4. \u8fd4\u56de\u6700\u5c0f\u503c\uff0c\u5982\u679c\u6ca1\u6709\u6570\u5b57\u7ec4\u5408\u6ee1\u8db3\u6761\u4ef6\uff0c\u5219\u8f93\u51fa -1\u3002
\u4e0b\u9762\u662f\u4e00\u4e2a Python \u4ee3\u7801\u793a\u4f8b\uff1a
```
def smallestSumPair(arr, k):
n = len(arr)
if n < 2:
return -1
# Create an empty hashmap
hashmap = {}
# Initialize minimum pair sum
min_sum = float('inf')
# Traverse through every element of arr and check if there is another number whose sum is k
for i in range(n):
# Check if k-arr[i] is present in hashmap or not
if k - arr[i] in hashmap:
# If present, update min_sum if needed
if arr[i] + k - arr[i] < min_sum:
min_sum = arr[i] + k -\u4e3a\u4e86\u627e\u5230\u7ec4a[i] \u548c a[j] \u4e2d\u4e24\u4e2a\u4e0d\u540c\u7684\u6570\u5b57 a[i] \u548c a[j] \u6ee1\u8db3 a[i] + a[j] = k\u7684\u6761\u4ef6\uff0c\u53ef\u4ee5\u7528\u54ea\u4e9b\u65b9\u6cd5\u5462\uff1f
\u4e00\u79cd\u53ef\u80fd\u6027\u6a21\u5f0f\u662f\u7528\u54ea\u4e9b\u6570\u636e\u7ed3\u6784\uff0c\u5f97\u5230\u4e24\u4e2a\u4e0d\u540c\u7684\u6570\u5b57\u76f8\u52a0\u7ed3\u679c\u4e3a k \uff0c\u4e00\u822c\u6761\u4ef6\u4e0b\uff0c\u53ef\u4ee5\u4f7f\u7528\u54ea\u4e9b\u7b97\u6cd5\u5462\uff1f
\u5982\u679c\u6570\u636e\u7684\u6574\u4f53\u5927\u5c0f\u4e0d\u5927\uff0c\u53ef\u4ee5\u901a\u8fc7\u6c42\u51fa\u6240\u6709\u7684 a[i] \u7ec4\u5408\uff0c\u5e76\u5c06\u8fd9\u4e9b\u6570\u5b57\u6307\u5411\u4e00\u4e2a hashmap \u6216\u8005 set \u4e2d\uff0c\u5982\u679c a[j] \u5b58\u5728\u4e8e\u54ea\u4e00\u4e2a\u6570\u5b57\u4e2d\uff0c\u4e14 k - a[j] \u4e5f\u5b58\u5728\u4e8e\u54ea\u4e00\u4e2a\u6570\u5b57\u4e2d\uff0c\u5219\u8868\u793a\u5f53\u524d\u7684 a[i] \u4e0e a[j] \u6ee1\u8db3\u6761\u4ef6\uff0c\u53ef\u4ee5\u5b9a\u4f4d\u51fa\u6700\u5c0f\u503c\u3002
\u5982\u679c\u6570\u636e\u7684\u6574\u4f53\u5927\u5c0f\u5927\uff0c\u53ef\u4ee5\u901a\u8fc7\u5e26\u6709\u987a\u5e8f\u7684\u6570\u7ec4\u7b97\u6cd5\uff0c\u5982\u679c\u4e3a O(nlogn) \u6216 O(n) \u65b9\u6cd5\u3002
\u4e00
如果有满足条件的组a[i] 和 a[j],则输出其中数值最小的数;如果没有找到,则输出-1。题目翻译:给定一个数列,找到其中两个不同的数字a[i]和a[j],使得它们的和等于给定的数k。如果存在一对a[i]和a[j]满足条件,则输出其中最小的数字。如果找不到这样的一对数字,则输出-1。
这个问题可以通过使用哈希表来解决。我们可以扫描数组,并将每个数字插入到哈希表中。对于每个数字a[i],我们可以检查是否存在另一个数字a[j],使得a[i]+a[j]=k。如果存在这样的数字,则我们可以将它们的索引保存下来并更新最小值。如果没有找到这样的一对数字,则输出-1。
以下是Python的实现:
```python
def find_min_sum_pair(arr, k):
n = len(arr)
min_sum = float('inf')
min_pair = [-1, -1]
hash_map = {}
for i in range(n):
if k - arr[i] in hash_map:
j = hash_map[k - arr[i]]
if arr[i] + arr[j] < min_sum:
min_sum = arr[i] + arr[j]
min_pair = [i, j]
hash_map[arr[i]] = i
if min_pair == [-1, -1]:
return -1
else:
return min(arr[min_pair[0]], arr[min_pair[1]])
```
其中,arr是输入的数列,k是给定的数。min_sum和min_pair分别用于保存当前找到的最小和以及对应的一对数字的索引。hash_map用于保存每个数字的索引。在实现中,我们首先将第一个数字的索引插入到哈希表中。然后,我们扫描整个数组,并在哈希表中查找是否存在一个数字a[j],使得a[j]=k-a[i],其中a[i]是当前扫描的数字。如果存在这样的数字,我们检查a[i]+a[j]是否小于当前的最小和,并更新最小和和对应的一对数字的索引。最后,我们返回两个数字中的最小值,如果找不到这样的数字,则返回-1。
阅读全文