2017-09-01 5 views
2

Ist diese Algorithmus Arbeit als Lösung für 3sum in O(N log(N)), wo das Problem von Wikipedia alsLöst dies 3SUM in O (N log (N)) Zeit?

In Komplexitätstheorie definiert ist, fordert das 3sum Problem, wenn ein bestimmte Satz von n reellen Zahlen enthält drei Elemente, die Summe zu Null.

//Given an array of integers called list 
//return true if 3 integers in list sum to 0, false otherwise 

//quicksort the provided list 
quickSort(list) 

//add all elements of the list to a hashmap where the key is a number and the value is the number of times it occurs 
hs = new hashMap<Integer, Integer>() 
for(Integer i:list) 
    if(hs.get(i)==null) 
     hs.add(i, 1) 
    else 
     hs.add(i, hs.get(i)+1) 

//create a pair of pointers pointing to the left of right of the center of array 
startIndex=0 
while (list[startIndex]<0 and startIndex<list.length-1) 
startIndex++ 

left=startIndex 
right=startIndex+1 

//run this loop while pointers are in boundaries of array 
while(! (left<0 or right>=list.length) 
{ 
    //see if a 3rd number that can be added to the numbers at left 
    //and right to make 0 can be found 
    sum=list[left] + list[right] 
    negsum= -(sum) 
    //if it's found enter these if statements 
    if(hs.get(negsum)!=null) 
    { 
     //check for the possibility that the 3rd number is one of the 1st 2, if not return true 
     if(negsum==list[left] or negsum== list[right]) 
     { 
     //if the 3rd number is one of the 1st 2 make sure that a duplicate of it exists, or if all 3 are 0, that 3 zeros exist 
     //if we have enough duplicates, return true 
      if(list[left]==list[right]) 
       if(list.hasMoreThanTwo(negsum)) 
        return true 
      else if(list.hasMoreThanOne(negsum)) 
       return true 
     } 
     else 
      return true 
    } 

    //if a trio cannot be formed with the numbers at left and right, adjust the pointers so that we will get closer to 0 and try again. 
    if (sum<0) 
     right++ 
    else 
     left-- 
} 

//if pointers go out of bounds 3 numbers that sum to 0 don't exist 
return false 
+1

Ihr Algorithmus geht nicht über alle Optionen ... – alfasin

Antwort

0

Hmmm. Ihr Code verarbeitet diesen Fall nicht:

[-10, -7, 0, 0, 4, 6].

In diesem Fall würde der rechte Zeiger außerhalb der Grenzen gehen, weil der linke Zeiger bei -10 wäre, was zu groß ist.

Wenn also etwas wirklich negativ ist, wird Ihr Algorithmus versuchen, nach einer positiven Lösung zu suchen und letztendlich zu scheitern.

0

Wenn ich den Algorithmus zu verstehen -, die Sie nicht auf einem hohen Niveau erklären haben - es wird nicht funktionieren. Es scheint, dass die Herangehensweise von der geringsten positiven (rechts) und negativen (links) Zahl ausgeht. Für jedes Paar suchen Sie nach einer dritten Zahl, um 0 zu bilden. Dann verschieben Sie eine Grenze zur nächstgrößeren Zahl und behalten die 2-Nummern-Summe nahe 0.

Das Problem ist, dass Sie überhaupt nicht garantiert sind die dreifache Anzahl relativ nahe 0. zum Beispiel enthält, so etwas wie

[-5100, -1700, -1600, -1000, 2500, 2600, 5000]

Werden Sie links sehen überspringen vorbei -1600 bis -1700 bevor Sie rechts zu 2600 finden, um die Lösung zu finden.

+0

Ich sehe keine Triple einschließlich -1100, die auf 0 summiert. – Zainan

+0

Mental Slip von 1.000 ... danke. – Prune

0

Wie bereits erwähnt, beinhaltet Ihr Code nicht alle möglichen Kombinationen. Hier werde ich einen Testfall untersuchen, in dem Ihr Code nicht alle Möglichkeiten berücksichtigt.

Wir haben folgende Array:

[101, 100, 100, 0, -50, -199, -200] 

Zur leichteren Verwendung ist es bereits sortiert worden. Dies wird umgewandelt in:

{101: (1, 0), 100:(2, 1), 0:(1, 2), -50:(1, 3), -199:(1, 4), -200:(1, 5)} 
[101, 100, 0, -50, -199, -200] 

Wir beginnen in der Mitte des Wertes, in diesem Fall 0 und -50.

Bei der ersten Iteration können wir sehen, dass nichts passt, und so verschieben wir die linke, da dies zu einer näheren Annäherung führen würde. (0 + -199 vs 100 + -50)

Die nächste Iteration, wir bewegen uns nach rechts. (100 + -199 vs 101 + -50)

Die Iteration nach, bewegen wir uns wieder nach rechts, da diese näher an 0 ist (101 + -199 vs 100 + -200)

Wie Sie Vielleicht haben wir bemerkt, dass wir gerade die Paarung von 100 und -200 übersprungen haben, was in diesem Fall das relevante Paar im Triplet (100, 100, -200) ist.

Verwandte Themen