2016-06-22 1 views
-8

Wir erhalten ein Array bestehend aus N Zahlen und einer Zahl X. Wir müssen einen Index K in diesem Array finden, der das Array in zwei Teile teilt (0 bis K-1 und K-1 bis N-1) als solche:Array-Codierungs-Herausforderung, die in O (n) -Komplexität gelöst werden muss

Anzahl der Elemente gleich X im ersten Teil = Anzahl der Elemente ungleich X im zweiten Teil.

Beispiel:

A = (5, 5, 1, 2, 3, 4, 5), X = 5 

Answer: K= 4 

(5, 5, 1, 2) contains two X's. 

(3, 4, 5) contains two non X's. 

Solche K existiert immer entsprechend der Problembeschreibung. Die Lösung muss eine O (N) -Komplexität aufweisen. O (N^2) Lösung ist zu einfach, aber ich konnte das O (N) nicht finden.

Hier ist, was ich bisher habe:

int function(int X, vector<int> &A) { 
    int k = 0; 
    vector<int> indices; 
    long count = A.size(); 
    int number_of_x= 0; 
    for(int i=0;i<count;i++){ 
     if(A[i]==X) 
      number_of_x++; 
    } 
    long part_one_x = 0; 
    long part_two_nonx = 0; 
    for(int i=0;i<count;i++){ 
     if(A[i]==X) 
      part_one_x++; 
     part_two_nonx = (count-i) - (number_of_x - part_one_x); 
     if(part_one_x == part_two_nonx) 
      k = i; 
    } 


    return k; 
} 

Vielen Dank für Ihre Hilfe!

+0

Hinweis: Machen Sie einen ersten Durchlauf durch das Array und zählen Sie die Anzahl der Xs. Dann finden Sie die Antwort auf den zweiten Durchgang. – samgak

+0

Die Aufgabe soll von Ihnen erledigt sein. Versuchen Sie es selbst zu lösen und stellen Sie spezifische Fragen, wenn Sie ein Problem haben. – Jeet

+0

Jeetendra, die Frist ist bereits abgelaufen, und es ist eine Codierung Herausforderung, zu der ich keinen Zugang habe. Es ist mir nur eingefallen. Samgak, ich tat wie du sagtest, aber ich wusste nicht, was ich im zweiten Durchgang machen sollte. –

Antwort

3

Lassen Sie sich Ihr Beispiel betrachten ...

A = (5, 5, 1, 2, 3, 4, 5) 

Wenn Sie das erste Element betrachten - 5 - dann wissen wir jede Lösung einen nicht-5-Wert am anderen Ende haben muss, damit wir arbeiten nach hinten zu finden die erste nicht-fünf, die Verfolgung der „vorne“ und „hinten“ Orte, an arbeiten wir ...

A = (5, 5, 1, 2, 3, 4, 5) 
    ^   ^

so haben wir die 5s bisher mit dem nicht-5s als wir ausgewogen von den Enden her arbeiten. Jetzt schauen wir auf die nächste Position auf der linken Seite, der auch eine fünf, so bewegen wir die rechte Position links, bis wir eine andere Nicht-fünf finden:

A = (5, 5, 1, 2, 3, 4, 5) 
     ^ ^

Jetzt haben wir die linke Position vorrücken suchen für weitere fünf, aber treffen Sie die richtige Position, bevor Sie eine finden, also ist die "rechte Seite" eine Lösung.

+0

Ja, das scheint eine andere Art zu sein. –

Verwandte Themen