1
votes

Trois nombres dans un tableau qui totalisent une somme cible en O (n)

Récemment, hashedin a posé le problème de la somme des triplets où trois nombres sont censés s'additionner à une somme cible. Ils ont dit de le faire en O (n).

J'ai essayé de le faire en O (n ^ 2). Tout d'abord, j'ai trié le tableau, puis pour rechercher la combinaison, j'ai dû appliquer la technique de la fenêtre coulissante à tous les éléments du tableau. Je ne parviens pas à le réduire à O (n).

def threeNumberSum(array, targetSum):
    array.sort()
    l = len(array)
    trip = list()
    for i in range(l-2):
        left = i+1
        right = len(array)-1
        while left<right:
            currentSum = array[i] + array[left] + array[right]
            if currentSum == targetSum:
                trip.append([array[i], array[left], array[right]])
                left += 1
                right -= 1
            elif currentSum < targetSum:
                left += 1
            else:
                right -= 1
    return trip

Ce code renvoie en fait toutes les combinaisons de sommes possibles. Mais selon l'entreprise, un seul triplet est nécessaire. Tous les triplés possibles ne sont pas nécessaires


0 commentaires

4 Réponses :


1
votes

La meilleure approche possible pour trouver un seul triplet est en O (n ^ 2) uniquement, il peut y avoir un malentendu entre vous et l'intervieweur. Il est impossible de le faire en O (n). Bon codage!


0 commentaires

0
votes

Il s'agit d'une solution basée sur le hachage qui a la complexité O (n) Programme Python3 pour trouver un triplet en utilisant Hashing, retourne true s'il y a un triplet avec une somme égale à 'sum' présent dans A []. Affiche également le triplet

def find3Numbers(A, arr_size, sum): 
  for i in range(0, arr_size-1): 
      # Find pair in subarray A[i + 1..n-1]  
      # with sum equal to sum - A[i] 
      s = set() 
      curr_sum = sum - A[i] 
      for j in range(i + 1, arr_size): 
          if (curr_sum - A[j]) in s: 
              print("Triplet is", A[i],  
                      ", ", A[j], ", ", curr_sum-A[j]) 
              return True
          s.add(A[j])  
  return False


2 commentaires

Comment cette solution fonctionnera en O (n)? Je pense que ce code a une complexité temporelle de O (n ^ 2).


Il n'est pas possible de le faire en temps O (n) complexité.



2
votes

Le code python mentionné comme ANSWER lui-même a une boucle for imbriquée, donc dans tous les cas, la complexité du pire des cas serait O (n ^ 2). Cas de test: 3 4 5 2 2 19 Somme requise = 23. Ce cas de test ne peut pas être résolu en O (n). Un peu de responsabilité devrait être là si quelqu'un répond sur stackoverflow.


0 commentaires

0
votes

Merci à tous d'avoir essayé de vous aider. J'ai trouvé une première solution pour le faire en O (n). Je ne sais pas encore si c'est correct, mais il fonctionne sur tous les cas de test Voici un lien Github pour télécharger le fichier python github.com/TripletInArrayWithTargetSum

def trip(arr, target):
    d = dict()
    n = len(arr)
    for i in arr:
        d[i] = 1

    i = 0
    j = n - 1
    while i<j:
        s = arr[i] + arr[j]     # Calculate the sum of the elements at i and j position
        diff = target - s       # Calculate the difference needed to complete the table
        if arr[i] != diff and arr[j] != diff and diff in d: # Check if the difference exists in the hashtable and as we cannot reuse elements
            return [arr[i], arr[j], diff]                   # diff should not be equal to elements at i or j and  then return the triplet if exists
        else:
            if s > target:                                  # If difference dosent exists then we adjust pointers
                j -= 1
            elif s == target:
                if arr[i+1] + arr[j] < target:
                    i+=1
                else:
                    j-=1
            else:
                i += 1

    return [None]

Téléchargez le fichier complet avec les cas de test sur Github


0 commentaires