51Nod 1090 3个数和为0 思维

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jsszwc/article/details/86931245

题目:

https://www.51nod.com/Challenge/Problem.html#!#problemId=1090

题意:

给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。

思路:

3 S u m 3Sum 问题,也是经典问题了。在 2 S u m 2Sum 问题中是从数组的左右两侧同时开始枚举数字,根据枚举的两个数字之和决定左侧或右侧往数组中间移动,使得两数之和逐渐逼近给定目标。 3 S u m 3Sum 问题中,首先对数组排序,之后枚举第一个数字,然后在第一个数字右侧的剩余数组中,使用 2 S u m 2Sum 的方法,就可以了

代码:

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()

猜你喜欢

转载自blog.csdn.net/jsszwc/article/details/86931245