Heim > Artikel > Web-Frontend > Typescript Coding Chronicles: Produkt von Array außer sich selbst
Geben Sie bei einem gegebenen ganzzahligen Array nums eine Array-Antwort zurück, sodass Antwort[i] gleich dem Produkt aller Elemente von nums außer nums[i] ist.
Das Produkt eines beliebigen Präfixes oder Suffixes von Zahlen passt garantiert in eine 32-Bit-Ganzzahl.
Sie müssen einen Algorithmus schreiben, der in O(n)-Zeit und ohne Verwendung der Divisionsoperation ausgeführt wird.
Können Sie das Problem in O(1) mit zusätzlicher Raumkomplexität lösen? (Das Ausgabearray zählt nicht als zusätzlicher Speicherplatz für die Raumkomplexitätsanalyse.)
Um dieses Problem zu lösen, müssen wir das Produkt aller Elemente außer dem aktuellen Element berechnen, ohne die Divisionsoperation zu verwenden. Dies kann durch zwei Durchgänge über das Array erfolgen:
Wir können zwei Arrays verwenden, um die Präfix- und Suffixprodukte zu speichern und sie dann zu multiplizieren, um das Endergebnis zu erhalten.
function productExceptSelf(nums: number[]): number[] { const n = nums.length; const prefixProducts = new Array(n).fill(1); const suffixProducts = new Array(n).fill(1); const result = new Array(n).fill(1); // Compute prefix products for (let i = 1; i < n; i++) { prefixProducts[i] = prefixProducts[i - 1] * nums[i - 1]; } // Compute suffix products for (let i = n - 2; i >= 0; i--) { suffixProducts[i] = suffixProducts[i + 1] * nums[i + 1]; } // Compute the result by multiplying prefix and suffix products for (let i = 0; i < n; i++) { result[i] = prefixProducts[i] * suffixProducts[i]; } return result; }
Die Basislösung funktioniert gut, benötigt aber zusätzlichen Platz zum Speichern von Präfix- und Suffixprodukten.
Wir können die Lösung optimieren, um O(1) zusätzlichen Speicherplatz zu nutzen, indem wir das Ausgabearray zunächst zum Speichern von Präfixprodukten verwenden und es dann direkt ändern, um die Suffixprodukte einzuschließen.
function productExceptSelfOptimized(nums: number[]): number[] { const n = nums.length; const result = new Array(n).fill(1); // Compute prefix products in the result array for (let i = 1; i < n; i++) { result[i] = result[i - 1] * nums[i - 1]; } // Compute suffix products and multiply with the prefix products let suffixProduct = 1; for (let i = n - 1; i >= 0; i--) { result[i] = result[i] * suffixProduct; suffixProduct *= nums[i]; } return result; } <h3> Zeitkomplexitätsanalyse: </h3> <ul> <li> <strong>Zeitkomplexität:</strong> O(n), wobei n die Länge des Arrays ist. Wir durchlaufen das Array zweimal.</li> <li> <strong>Raumkomplexität:</strong> O(1), da wir das Ausgabearray zum Speichern von Zwischenergebnissen verwenden und keinen zusätzlichen Platz verbrauchen.</li> </ul> <h3> Verbesserungen gegenüber der Basislösung: </h3> <ul> <li>Die optimierte Lösung reduziert die Raumkomplexität auf O(1), indem das Ausgabearray für Zwischenergebnisse verwendet wird.</li> </ul> <h2> Randfälle und Tests: </h2> <h3> Randfälle: </h3> <ol> <li>Das Array enthält Null(en).</li> <li>Das Array enthält negative Zahlen.</li> <li>Die Array-Länge ist die minimale (2) oder maximale (10^5) Grenze.</li> </ol> <h3> Testfälle: </h3> <pre class="brush:php;toolbar:false">console.log(productExceptSelf([1,2,3,4])); // [24,12,8,6] console.log(productExceptSelf([-1,1,0,-3,3])); // [0,0,9,0,0] console.log(productExceptSelf([2,2,2,2])); // [8,8,8,8] console.log(productExceptSelf([0,0])); // [0,0] console.log(productExceptSelf([5])); // This should not be a valid input as the minimum length is 2 console.log(productExceptSelf([1,2])); // [2, 1] console.log(productExceptSelfOptimized([1,2,3,4])); // [24,12,8,6] console.log(productExceptSelfOptimized([-1,1,0,-3,3])); // [0,0,9,0,0] console.log(productExceptSelfOptimized([2,2,2,2])); // [8,8,8,8] console.log(productExceptSelfOptimized([0,0])); // [0,0] console.log(productExceptSelfOptimized([5])); // This should not be a valid input as the minimum length is 2 console.log(productExceptSelfOptimized([1,2])); // [2, 1]
Präfix-Summen-Array:
In-Place-Algorithmen:
Array-Manipulation:
Durch das Üben solcher Probleme und Strategien können Sie Ihre Problemlösungsfähigkeiten verbessern und besser auf verschiedene Programmierherausforderungen vorbereitet sein.
Das obige ist der detaillierte Inhalt vonTypescript Coding Chronicles: Produkt von Array außer sich selbst. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!