Find 2 numbers in an unsorted array equal to a given sum

前端 未结 18 748
太阳男子
太阳男子 2020-11-29 19:56

We need to find pair of numbers in an array whose sum is equal to a given value.

A = {6,4,5,7,9,1,2}

Sum = 10 Then the pairs are - {6,4} ,

相关标签:
18条回答
  • 2020-11-29 20:35

    Python 2.7 Implementation:

    import itertools
    list = [1, 1, 2, 3, 4, 5,]
    uniquelist = set(list)
    targetsum = 5
    for n in itertools.combinations(uniquelist, 2):
        if n[0] + n[1] == targetsum:
        print str(n[0]) + " + " + str(n[1])
    

    Output:

    1 + 4
    2 + 3
    
    0 讨论(0)
  • 2020-11-29 20:36

    Shouldn't iterating from both ends just solve the problem?

    Sort the array. And start comparing from both ends.

    if((arr[start] + arr[end]) < sum) start++;
    if((arr[start] + arr[end]) > sum) end--;
    if((arr[start] + arr[end]) = sum) {print arr[start] "," arr[end] ; start++}
    if(start > end)  break;
    

    Time Complexity O(nlogn)

    0 讨论(0)
  • 2020-11-29 20:36

    https://github.com/clockzhong/findSumPairNumber

    #! /usr/bin/env python
    import sys
    import os
    import re
    
    
    #get the number list
    numberListStr=raw_input("Please input your number list (seperated by spaces)...\n")
    numberList=[int(i) for i in numberListStr.split()]
    print 'you have input the following number list:'
    print numberList
    
    #get the sum target value
    sumTargetStr=raw_input("Please input your target number:\n")
    sumTarget=int(sumTargetStr)
    print 'your target is: '
    print sumTarget
    
    
    def generatePairsWith2IndexLists(list1, list2):
        result=[]
        for item1 in list1:
            for item2 in list2:
                #result.append([item1, item2])
                result.append([item1+1, item2+1])
        #print result
        return result
    
    def generatePairsWithOneIndexLists(list1):
        result=[]
        index = 0
        while index< (len(list1)-1):
            index2=index+1
            while index2 < len(list1):
                #result.append([list1[index],list1[index2]])
                result.append([list1[index]+1,list1[index2]+1])
                index2+=1
            index+=1
        return result
    
    
    def getPairs(numList, target):
        pairList=[]
        candidateSlots=[] ##we have (target-1) slots 
    
        #init the candidateSlots list
        index=0
        while index < target+1:
            candidateSlots.append(None)
            index+=1
    
        #generate the candidateSlots, contribute O(n) complexity
        index=0
        while index<len(numList):
            if numList[index]<=target and numList[index]>=0:
                #print 'index:',index
                #print 'numList[index]:',numList[index]     
                #print 'len(candidateSlots):',len(candidateSlots)
                if candidateSlots[numList[index]]==None:
                    candidateSlots[numList[index]]=[index]
                else:
                    candidateSlots[numList[index]].append(index)
            index+=1
    
        #print candidateSlots
    
        #generate the pairs list based on the candidateSlots[] we just created
        #contribute O(target) complexity
        index=0
        while index<=(target/2):
            if candidateSlots[index]!=None and candidateSlots[target-index]!=None:
                if index!=(target-index):
                    newPairList=generatePairsWith2IndexLists(candidateSlots[index], candidateSlots[target-index])
                else:
                    newPairList=generatePairsWithOneIndexLists(candidateSlots[index])
                pairList+=newPairList
            index+=1
    
        return pairList
    
    print getPairs(numberList, sumTarget)
    

    I've successfully implemented one solution with Python under O(n+m) time and space cost. The "m" means the target value which those two numbers' sum need equal to. I believe this is the lowest cost could get. Erict2k used itertools.combinations, it'll also cost similar or higher time&space cost comparing my algorithm.

    0 讨论(0)
  • 2020-11-29 20:37
        public void printPairsOfNumbers(int[] a, int sum){
        //O(n2)
        for (int i = 0; i < a.length; i++) {
            for (int j = i+1; j < a.length; j++) {
                if(sum - a[i] == a[j]){
                    //match..
                    System.out.println(a[i]+","+a[j]);
                }
            }
        }
    
        //O(n) time and O(n) space
        Set<Integer> cache = new HashSet<Integer>();
        cache.add(a[0]);
        for (int i = 1; i < a.length; i++) {
            if(cache.contains(sum - a[i])){
                //match//
                System.out.println(a[i]+","+(sum-a[i]));
            }else{
                cache.add(a[i]);
            }
        }
    
    }
    
    0 讨论(0)
  • If numbers aren't very big, you can use fast fourier transform to multiply two polynomials and then in O(1) check if coefficient before x^(needed sum) sum is more than zero. O(n log n) total!

    0 讨论(0)
  • 2020-11-29 20:41

    if its a sorted array and we need only pair of numbers and not all the pairs we can do it like this:

    public void sums(int a[] , int x){ // A = 1,2,3,9,11,20 x=11
        int i=0 , j=a.length-1;
        while(i < j){
          if(a[i] + a[j] == x) system.out.println("the numbers : "a[x] + " " + a[y]);
          else if(a[i] + a[j] < x) i++;
          else j--;
        }
    }
    

    1 2 3 9 11 20 || i=0 , j=5 sum=21 x=11
    1 2 3 9 11 20 || i=0 , j=4 sum=13 x=11
    1 2 3 9 11 20 || i=0 , j=4 sum=11 x=11
    END

    0 讨论(0)
提交回复
热议问题