版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jsszwc/article/details/86931245
题目:
https://www.51nod.com/Challenge/Problem.html#!#problemId=1090
题意:
给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
思路:
问题,也是经典问题了。在 问题中是从数组的左右两侧同时开始枚举数字,根据枚举的两个数字之和决定左侧或右侧往数组中间移动,使得两数之和逐渐逼近给定目标。 问题中,首先对数组排序,之后枚举第一个数字,然后在第一个数字右侧的剩余数组中,使用 的方法,就可以了
代码:
def main():
n = int(input())
arr = [None] * n
for i in range(n):
arr[i] = int(input())
arr.sort()
flag = False
i = 0
while i < n-2:
l, r = i+1, n-1
while l < r:
val = arr[i] + arr[l] + arr[r]
if val == 0:
print(arr[i], arr[l], arr[r])
flag = True
l, r = l+1, r-1
#题目保证数组的每个数字各不相同,所以之后的5个用来去重的while是多余的,可以直接去掉
while l < r and arr[l] == arr[l-1]:
l = l + 1
while l < r and arr[r] == arr[r+1]:
r = r - 1
elif val < 0:
l = l + 1
while l < r and arr[l] == arr[l-1]:
l = l + 1
else:
r = r - 1
while l < r and arr[r] == arr[r+1]:
r = r - 1
i = i + 1
while i < n-2 and arr[i] == arr[i-1]:
i = i + 1
if not flag:
print("No Solution")
main()