固定和的元素对
Description
输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,统计这样两个数的对数。
Input
输入第一行为用例个数, 每个测试用例输入第一行是数组,每一个数用空格隔开;第二行是数字和。
Output
输出这样两个数有几对。
Sample Input 1
1
1 2 4 7 11 0 9 15
11
Sample Output 1
3
python3
参考:https://blog.csdn.net/mimi9919/article/details/51335337/
# 固定和的元素对
# 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,统计这样两个数的对数
# 用暴力法穷举可以很方便做出来,但此时时间复杂度为O(N2),考虑先排序后查找
# 排序的时间复杂度为O(N*log2N),而对每个元素都进行二分查找也需要O(N*log2N),因此,总时间复杂度为O(N*log2N)
# 或排序后从两端开始比较下来,此时注意当和刚好满足时,考虑是左边先走还是右边先走,此时应先比较下一个能否构成满足条件。
# 二分查找,排序后二分查找O(N*log2N)比不排序直接查找O(N2)效率更高,此题默认没有重复数字,否则,二分查找可能有错误
def binary_search(lis, num):
left = 0
right = len(lis) - 1
while left <= right:
mid = (left + right) // 2
if num < lis[mid]:
right = mid - 1
elif num > lis[mid]:
left = mid + 1
else:
return mid
return -1
nums = int(input())
for n in range(nums):
arr = list(map(int, input().split()))
input_sum = int(input())
arr.sort() # 排序
result = 0
for i in range(len(arr)):
search_num = input_sum - arr[i] # 查找计算构成固定和所需的另一个数字
m = binary_search(arr, search_num) # 进行二分查找
if m != -1:
result += 1
print(result // 2) # 注意,二分查找会对两个元素分别查一遍,所以得到的结果是答案的2倍