美文网首页
【python程序员代码面试指南】不重复打印排序数组中相加和为给

【python程序员代码面试指南】不重复打印排序数组中相加和为给

作者: 阿牛02 | 来源:发表于2019-08-05 11:40 被阅读0次

    题目:给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组  例如, arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9], k = 10,

    打印结果为:   1, 9  和 2, 8 

      [要求] 时间复杂度为O(n)O(n)O(n),空间复杂度为O(1)O(1)O(1)

    分析:第一种复杂度较高的方法,可以采用遍历一遍数组,然后采用二分的方法进行查找。第二种方法,则是通过首尾指针进行搜索。

    【1】code:

    def binary_chop(lists, data):

        begin = 0

        end = len(lists) - 1

        while begin <= end:

            mid = (begin + end) // 2

            if lists[mid] > data:

                end = mid - 1

            elif lists[mid] < data:

                begin = mid + 1

            else:

                return mid

        return False

    arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9]

    k = 10

    lis = []

    for i in range(len(arr)):

        m = k - arr[i]

        j = binary_chop(arr, m)

        if j != False and i != j and j not in lis:

            print(arr[i], arr[j])

            lis.append(i)

    【2】code

    [n, k] = [10, 10]#[n,k] = list(map(int,input().split()))

    lists = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9]#lists = list(map(int,input().split()))

    start = 0

    end = len(lists) - 1

    while start < end:

        if lists[start] + lists[end] == k:

            print(lists[start],lists[end])

            j = start

            while ((start < end) and (lists[j] == lists[start])):

                start += 1

            j = end

            while ((start < end) and (lists[j] == lists[end])):

                end -= 1

        elif lists[start] + lists[end] < k:

            start += 1

        else:

            end -= 1

    程序的运行结果为:

    1, 9

    2, 8

    相关文章

      网友评论

          本文标题:【python程序员代码面试指南】不重复打印排序数组中相加和为给

          本文链接:https://www.haomeiwen.com/subject/fqwpdctx.html