hvernig á að finna einstaka þríbura úr javascript fylki


svara 1:

Það er einfalt O (N²) reiknirit sem krefst engra annarra gagnagerða.

Lausnin notar rennigluggann / reiknirit tveggja ábendinga. Við skulum reyna að leysa einfaldara vandamálið fyrst:

  • Gefið raðað fylki, finndu öll pör af þáttum a, b þannig að a + b = c, gefið gildi
  • Segjum nú að við höfum fundið lausn ar [i], ar [j]. Það er, ar [i] + ar [j] = c. Ef það er einhver önnur lausn með ar [i '] (Það er ar [i'] + ar [j '] = c) munum við hafa j'≤j. Með þessari athugun er hægt að leysa vandamálið með eftirfarandi aðgerð í O (N):

    ógilt fundapar (int ar [], int N, int c){ fyrir (int i = 0, j = N-1; i { // Færðu j-bendilinn til vinstri þar til summan <= c ef (ar [i] + ar [j]> c) { j--; halda áfram; } ef (ar [i] + ar [j] == c) printf ("% d% d \ n", ar [i], ar [j]); i ++; }}

    Nú, ef það eru afrit færslur í fylkinu, þá gætu verið afrit færslur í framleiðslunni líka. Þessu er auðvelt að sjá um með einfaldri breytingu. Við tryggjum að við vinnum aðeins i-gildin sem svara til tiltekins ar [i] aðeins einu sinni:

    ógilt fundapar (int ar [], int N, int c){ fyrir (int i = 0, j = N-1; i { ef (ar [i] + ar [j]> c) { j--; halda áfram; } ef (ar [i] + ar [j] == c) printf ("% d% d \ n", ar [i], ar [j]); // Aukning i til ar [i] er frábrugðin núverandi gildi gera { i ++; } meðan ((i }}

    Nú til að komast aftur að upphaflega vandamálinu. Við munum raða fylkinu fyrst til að nota reikniritið tveggja ábendinga. Við skulum laga minnsta frumefnið í þríburnum ar [i]. Nú verðum við að finna aðra þætti í fylkinu þannig að summan þeirra er -ar [i]. Notaðu sama bragð til að forðast endurtekningar, hér er loka lausnin:

    ógildar uppgötvunartruflanir (int ar [], int N){ // Flokkaðu fyrst fylkið þar sem aðferðin virkar aðeins fyrir flokkaða fylki raða (ar, ar + N); // Lykkjaðu yfir fyrsta þætti þríburans fyrir (int i = 0; i { // Fargaðu endurtekningum fyrir fyrsta þáttinn ef ((i> 0) && (ar [i] == ar [i-1])) halda áfram; // Þessi lykkja er í raun sú sama og findpairs () hér að ofan. fyrir (int j = i + 1, k = N-1; j { ef (ar [i] + ar [j] + ar [k]> 0) { k--; halda áfram; } ef (ar [i] + ar [j] + ar [k] == 0) { printf ("% d% d% d \ n", ar [i], ar [j], ar [k]); } gera { j ++; } meðan ((j } }}

    Flokkun tekur O (N log N) tíma en endurtekin notkun tveggja vísir reikniritsins tekur O (N²) tíma.


svara 2:

Það er aðeins tilbrigði við 3sum vandamál og Brian Schmitz sagði: 1. Raðaðu fylkinu 2. Lagaðu fyrsta þáttinn og finndu aðra tvo byggða á athuguninni hér að neðan a [x] + a [y] + a [z] = 0 a [ x] = - (a [y] + a [z]) Svo við verðum bara að komast að því hvort [y] + a [z] er jafnt og [x] eða ekki.

Einfaldur python kóði til að sýna það sama. def sum3 (a): a.sort (); prentaðu ai = 0 fyrir i á bilinu (0, len (a) -4): x = iy = i + 1 z = len (a) - 1 fyrir j á bilinu (1, len (a) -3): ef a [x] + a [y] + a [z] == 0: prentaðu a [x], a [y], a [z] y + = 1 z - = 1 elif a [x] + a [y ] + a [z] <0: y + = 1 annar: z - = 1

a = [-1, 0, 1, 2, -2, -3, -4] prentsumma3 (a)


svara 3:

Þótt

Raziman

hefur lýst grunnhugmyndinni, ef einhver vill samt gera meira af hlutum þá lestu hér, það er vel þekkt

3SUM

vandamál, sem hægt er að leysa í

eins og wiki síða segir.


svara 5:
Samsetningar

Hvað með þessa einlínulausn í Python sem mér datt í hug: