Codility K complementary pairs

来源:互联网 发布:系统之家windows vista 编辑:程序博客网 时间:2024/06/05 01:53

codelity kcomplementary pairs

                A non-empty zero-indexed array A consisting of N integers is given.                A pair of integers (P, Q) is called K-complementary in array A if 0 ≤ P, Q < N and A[P] + A[Q] = K.                For example, consider array A such that:                  A[0] =  1  A[1] = 8  A[2]= -3                  A[3] =  0  A[4] = 1  A[5]=  3                  A[6] = -2  A[7] = 4  A[8]=  5                The following pairs are 6-complementary in array A: (0,8), (1,6), (4,8), (5,5), (6,1), (8,0), (8,4).#这里要注意找到一对(A[i],A[j])之后, 除非i==j,不然要算两次。例如这里(4,8)和(8,4)                For instance, the pair (4,8) is 6-complementary because A[4] + A[8] = 1 + 5 = 6.                Write a function:                        class Solution { public int solution(int K, int[] A); }                that, given an integer K and a non-empty zero-indexed array A consisting of N integers, .1point3acres缃�                returns the number of K-complementary pairs in array A.                For example, given K = 6 and array A such that:                  A[0] =  1  A[1] = 8  A[2]= -3                  A[3] =  0  A[4] = 1  A[5]=  3                  A[6] = -2  A[7] = 4  A[8]=  5                the function should return 7, as explained above.                Assume that:                        N is an integer within the range [1..50,000];-google 1point3acres                        K is an integer within the range [−2,147,483,648..2,147,483,647];                        each element of array A is an integer within the range [−2,147,483,648..2,147,483,647].                Complexity:                        expected worst-case time complexity is O(N*log(N));. visit 1point3acres.com for more.                        expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).                Elements of input arrays can be modified.test case(6, [1, 8, -3, 0, 1, 3, -2, 4, 5]) , result = 7

这里要注意找到一对(A[i],A[j])之后, 除非i==j,不然要算两次。例如这里(4,8)和(8,4)。

这里提供两种方法。一种用dict记录key = A element value = the distinct number of A element. 然后循环这个dict就行。第二种就是先sort,然后首尾two pointers,不断向中间靠拢。这里值得注意的就是说重复值,A[i]之后如果有一串重复值,A[j]之后也有一串重复值,那么就要用while判断出各自重复了多少次,然后次数相乘并且乘以2,因为一个pair要算两次,除非i == j.

# you can write to stdout for debugging purposes, e.g.# print "this is a debug message"def solution(K, A):    # write your code in Python 2.7    if len(A) < 2:        return 0    '''method1    mydict = {}    for x in A:        if x in mydict:            mydict[x] += 1        else:            mydict[x] = 1    N = 0    for i in mydict:        if K - i > -2147483648:            N += mydict[i] * mydict.get(K - i, 0)    return N    '''    #method 2    A.sort()    i,j = 0, len(A) - 1    N = 0    print A    while i<=j:        sumval = A[i] + A[j]        if sumval == K:            k1,k2 = i,j            if k1 == k2:                N += 1                break            else:                while A[k1] == A[i]: k1 += 1                while A[k2] == A[j]: k2 -= 1                N += (k1 - i) *(j - k2) * 2                i,j = k1, k2        elif sumval < K:            i += 1        else:            j -= 1        print (A[i],A[j], N)    return N
0 0
原创粉丝点击