jak najít jedinečný triplet z pole javascript


Odpověď 1:

Existuje jednoduchý algoritmus O (N²), který nevyžaduje žádné další datové struktury.

Řešení využívá algoritmus posuvného okna / dvou ukazatelů. Pokusme se nejprve vyřešit jednodušší problém:

  • Vzhledem k seřazenému poli najděte všechny páry prvků a, b tak, aby a + b = c, danou hodnotu
  • Nyní předpokládejme, že jsme našli řešení ar [i], ar [j]. To znamená, že ar [i] + ar [j] = c. Pokud existuje nějaké jiné řešení s ar [i '] (tj. Ar [i'] + ar [j '] = c), budeme mít j'≤j. Pomocí tohoto pozorování lze problém vyřešit následující funkcí v O (N):

    neplatné vyhledávače (int ar [], int N, int c){ pro (int i = 0, j = N-1; i { // Přesuňte ukazatel j doleva do součtu <= c if (ar [i] + ar [j]> c) { j--; pokračovat; } if (ar [i] + ar [j] == c) printf ("% d% d \ n", ar [i], ar [j]); i ++; }}

    Nyní, pokud jsou v poli duplicitní položky, mohou být ve výstupu také duplicitní položky. Snadno se o to postará jednoduchá modifikace. Zajistíme, že i-hodnoty odpovídající danému ar [i] zpracujeme pouze jednou:

    neplatné vyhledávače (int ar [], int N, int c){ pro (int i = 0, j = N-1; i { if (ar [i] + ar [j]> c) { j--; pokračovat; } if (ar [i] + ar [j] == c) printf ("% d% d \ n", ar [i], ar [j]); // Přírůstek i do ar [i] se liší od aktuální hodnoty dělat { i ++; }zatímco já }}

    Nyní k návratu k původnímu problému. Nejprve seřadíme pole, abychom využili algoritmus dvou ukazatelů. Nejprve opravíme nejmenší prvek v triplet ar [i]. Nyní musíme najít další prvky v poli tak, aby jejich součet byl -ar [i]. Pomocí stejného triku, aby se zabránilo opakování, je zde konečné řešení:

    neplatné vyhledávací triplety (int ar [], int N){ // Nejprve seřaďte pole, protože metoda funguje pouze pro seřazená pole sort (ar, ar + N); // Loop over first element of triplet pro (int i = 0; i { // Zrušit opakování pro první prvek if ((i> 0) && (ar [i] == ar [i-1])) continue; // Tato smyčka je v podstatě stejná jako výše uvedená metoda findpair (). pro (int j = i + 1, k = N-1; j { if (ar [i] + ar [j] + ar [k]> 0) { k--; pokračovat; } if (ar [i] + ar [j] + ar [k] == 0) { printf ("% d% d% d \ n", ar [i], ar [j], ar [k]); } dělat { j ++; } while ((j } }}

    Třídění zabere čas O (N log N), zatímco opakované použití algoritmu dvou ukazatelů zabere čas O (N²).


Odpověď 2:

Je to jen variace problému 3sum a Brian Schmitz řekl: 1. Seřaďte pole 2. Opravte první prvek a najděte další dva na základě níže uvedeného pozorování a [x] + a [y] + a [z] = 0 a [ x] = - (a [y] + a [z]) Takže musíme jen zjistit, zda a [y] + a [z] je rovno [x] nebo ne.

Jednoduchý kód v Pythonu pro ilustraci toho samého. def sum3 (a): a.sort (); tisk ai = 0 pro i v rozsahu (0, len (a) -4): x = iy = i + 1 z = len (a) - 1 pro j v rozsahu (1, len (a) -3): pokud a [x] + a [y] + a [z] == 0: tisk a [x], a [y], a [z] y + = 1 z - = 1 elif a [x] + a [y ] + a [z] <0: y + = 1 jinak: z - = 1

a = [-1, 0, 1, 2, -2, -3, -4] součet tisku3 (a)


Odpověď 3:

Ačkoli

Raziman

popsal základní myšlenku, pokud někdo stále chce dělat více věcí, přečtěte si zde, je to dobře známé

3SUM

problém, který lze vyřešit v

jak říká wiki stránka.


Odpověď 5:
Kombinace

Co takhle jednořádkové řešení v Pythonu, na které jsem myslel: