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

前端 未结 18 747
太阳男子
太阳男子 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:25

    Below code takes the array and the number N as the target sum. First the array is sorted, then a new array containing the remaining elements are taken and then scanned not by binary search but simple scanning of the remainder and the array simultaneously.

    public static int solution(int[] a, int N) {
    
        quickSort(a, 0, a.length-1);    // nlog(n)
    
        int[] remainders = new int[a.length];
    
        for (int i=0; i<a.length; i++) {
            remainders[a.length-1-i] = N - a[i];     // n
        }
    
        int previous = 0;
    
        for (int j=0; j<a.length; j++) {            // ~~ n
    
            int k = previous;
    
            while(k < remainders.length && remainders[k] < a[j]) {
                k++;
            }
    
            if(k < remainders.length && remainders[k] == a[j]) {
                return 1;
            }
    
            previous = k;
        }
    
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-29 20:27
    for (int i=0; i < array.size(); i++){
      int value = array[i];
      int diff = sum - value; 
      if (! hashSet.contains(diffvalue)){
          hashSet.put(value,value);
      } else{
           printf(sum = diffvalue + hashSet.get(diffvalue));
      } 
    }
    
    --------
    Sum being sum of 2 numbers.
    
    0 讨论(0)
  • 2020-11-29 20:29

    This is a classic interview question from Microsoft research Asia.
    How to Find 2 numbers in an unsorted array equal to a given sum.

    [1]brute force solution
    This algorithm is very simple. The time complexity is O(N^2)

    [2]Using binary search
    Using bianry searching to find the Sum-arr[i] with every arr[i], The time complexity can be reduced to O(N*logN)

    [3]Using Hash
    Base on [2] algorithm and use hash, the time complexity can be reduced to O(N), but this solution will add the O(N) space of hash.

    [4]Optimal algorithm:

    Pseduo-code:

    for(i=0;j=n-1;i<j)
       if(arr[i]+arr[j]==sum) return (i,j);
    else if(arr[i]+arr[j]<sum) i++;
    else j--;
    return(-1,-1);
    

    or

    If a[M] + a[m] > I then M--
    If a[M] + a[m] < I then m++
    If a[M] + a[m] == I you have found it
    If m > M, no such numbers exist.
    

    And, Is this quesiton completely solved? No. If the number is N. This problem will become very complex.

    The quesiton then:
    How can I find all the combination cases with a given number?

    This is a classic NP-Complete problem which is called subset-sum.
    To understand NP/NPC/NP-Hard you'd better to read some professional books.

    References:
    [1]http://www.quora.com/Mathematics/How-can-I-find-all-the-combination-cases-with-a-given-number
    [2]http://en.wikipedia.org/wiki/Subset_sum_problem

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

    Create a dictionary with pairs Key (number from the list) and the Value is the number which is necessary to obtain a desired value. Next, check the presence of the pairs of numbers in the list.

    def check_sum_in_list(p_list, p_check_sum):
        l_dict = {i: (p_check_sum - i) for i in p_list}
        for key, value in l_dict.items():
            if key in p_list and value in p_list:
                return True
        return False
    
    
    if __name__ == '__main__':
        l1 = [1, 3, 7, 12, 72, 2, 8]
        l2 = [1, 2, 2, 4, 7, 4, 13, 32]
    
        print(check_sum_in_list(l1, 10))
        print(check_sum_in_list(l2, 99))
    
    Output:
    True
    Flase
    

    version 2

    import random
    
    
    def check_sum_in_list(p_list, p_searched_sum):
        print(list(p_list))
        l_dict = {i: p_searched_sum - i for i in set(p_list)}
        for key, value in l_dict.items():
            if key in p_list and value in p_list:
                if p_list.index(key) != p_list.index(value):
                    print(key, value)
                    return True
        return False
    
    
    if __name__ == '__main__':
        l1 = []
        for i in range(1, 2000000):
            l1.append(random.randrange(1, 1000))
    
        j = 0
        i = 9
        while i < len(l1):
            if check_sum_in_list(l1[j:i], 100):
                print('Found')
                break
            else:
                print('Continue searching')
                j = i
                i = i + 10
    
    Output:
    ...
    [154, 596, 758, 924, 797, 379, 731, 278, 992, 167]
    Continue searching
    [808, 730, 216, 15, 261, 149, 65, 386, 670, 770]
    Continue searching
    [961, 632, 39, 888, 61, 18, 166, 167, 474, 108]
    39 61
    Finded
    [Finished in 3.9s]
    
    0 讨论(0)
  • 2020-11-29 20:33

    Does the obvious solution not work (iterating over every consecutive pair) or are the two numbers in any order?

    In that case, you could sort the list of numbers and use random sampling to partition the sorted list until you have a sublist that is small enough to be iterated over.

    0 讨论(0)
  • 2020-11-29 20:34
        public static void Main(string[] args)
        {
            int[] myArray =  {1,2,3,4,5,6,1,4,2,2,7 };
            int Sum = 9;
    
                for (int j = 1; j < myArray.Length; j++)
                {                    
                    if (myArray[j-1]+myArray[j]==Sum)
                    {
                        Console.WriteLine("{0}, {1}",myArray[j-1],myArray[j]);
                    }
                }            
            Console.ReadLine();
        }
    
    0 讨论(0)
提交回复
热议问题