Finden Sie GCD-Paare für ein bestimmtes Array
Java-Fragen und Antworten: Das Finden von GCD-Paaren eines bestimmten Arrays ist eine häufige Frage, die die Berechnung des größten gemeinsamen Teilers (GCD) der Zahlen im Array erfordert. In Java können Sie dieses Problem mit dem euklidischen Algorithmus lösen. In diesem Artikel stellt der PHP-Editor Xigua vor, wie man mit Java eine Methode schreibt, um das GCD-Paar eines bestimmten Arrays zu finden, und hilft den Lesern, diesen Algorithmus besser zu verstehen und anzuwenden.
Frageninhalt
Gegeben sei ein ganzzahliges Array der Größe n, wobei n eine gerade Zahl ist. Wählen Sie 2 Zahlen aus dem Array aus und finden Sie gcd. Wählen Sie ebenfalls zwei Elemente aus den verbleibenden Elementen im Array aus und suchen Sie nach gcd. Wiederholen Sie die obigen Schritte, um das gcd-Paar zu finden. Summieren Sie die gcd-Werte und erhalten Sie die höchste Summe.
Einschränkungen:
n is in range 2 to 20 arr[i] is in range 1 to 10^9
Beispiel 1:
arr = [3,4,9,5]
Antwort:
4
Anleitung:
a) gcd of (4,5) is 1 b) gcd of (3,9) is 3 sum = 1+3 = 4. this is the highest possible gcd sum.
Beispiel 2:
arr = [1,2,3,4,5,6]
Antwort:
6
Anleitung:
a) gcd of (1,5) is 1 b) gcd of (2,4) is 2 c) gcd of (3,6) is 3 sum = 1+2+3 = 6. this is the highest possible gcd sum.
Das ist mein Code:
public static int solve(int[] ar) { int n = ar.length; Arrays.sort(ar); int sum = 0; for(int i=0; i<n/2; i++) { int a = ar.get(i), b = ar.get(n-i-1); int c = gcd(a,b); sum += c; } return sum; } static int gcd(int a, int b) { // if b=0, a is the GCD if (b == 0) return a; // call the gcd() method recursively by // replacing a with b and b with // modulus(a,b) as long as b != 0 else return gcd(b, a % b); }
Mein Code funktioniert für das erste Beispiel, liefert aber für das zweite Beispiel eine falsche Ausgabe. Ich habe es debuggt und festgestellt, dass die von mir verwendete Methode falsch war. Was ist der richtige Weg, dieses Problem zu lösen?
Lösung
Wir können alle möglichen Wege rekursiv durchsuchen, um den gesamten gcd zu berechnen. was zu tun?
Wenn das Array nur zwei Elemente enthält, können wir den gcd nur dieser beiden Elemente zurückgeben.
Wenn es mehr enthält, iterieren wir über alle Wertepaare. Für jedes Paar berechnen wir seinen gcd und rufen unsere Funktion auch rekursiv mit einer Kopie des Arrays auf, wobei beide Werte entfernt wurden. Wenn wir die Ergebnisse beider Berechnungen addieren, erhalten wir den gesamten gcd für das aktuell ausgewählte Wertepaar.
Jetzt behalten wir einfach den Überblick über den besten bisher gefundenen gcd und geben ihn am Ende zurück.
Dies ist der Code, der genau das tun (sollte).
int solve(int[] ar) { // if we have only two elements, there's not much else we can do. if(ar.length == 2) { return gcd(ar[0], ar[1]); } //keep track of the largest gcd int best = 0; // for every pair of values in the array // make a copy of the array without the pair and call recursively for(int i = 0; i < ar.length; i++) { for(int j = i + 1; j < ar.length; j++) { int score = gcd(ar[i], ar[j]); // make a copy int[] ar2 = new int[ar.length - 2]; int copy_k = 0; for(int k=0; k < ar.length; k++) { // skip values that we already visited if(k == i || k == j) { continue; } ar2[copy_k] = ar[k]; copy_k += 1; } // call recursively score += solve(ar2); if(score > best) // we found a better pair best = score; } } return best; }
Dieser Algorithmus ist ziemlich langsam. Wenn Sie die Dinge beschleunigen müssen, gibt es mindestens zwei Bereiche, in denen Sie sich verbessern können:
- Die Berechnung des gcd ist ein teurer Vorgang. Durch die Vorabberechnung des gcd aller möglichen eindeutigen Wertepaare und deren Speicherung in einer Hashmap werden Doppelberechnungen vermieden.
- Es prüft einige mögliche Permutationen mehrmals. (z. B. ist die Auswahl des ersten Paares und dann des zweiten Paares bei der nächsten Rekursion dasselbe wie die Auswahl des zweiten Paares und dann des ersten Paares) Ich habe einige vage Ideen, wie ich dieses Problem lösen kann, aber heute Abend ist es zu spät. Tut mir leid . < /em>
Höchstwahrscheinlich gibt es einen schnelleren Algorithmus, das ist nur meine Idee.
Herausgeber: Nun, nach etwas Schlaf habe ich es plötzlich verstanden. Wenn wir beim Erstellen von Paaren die äußere Schleife weglassen, erhalten wir keine doppelte Sortierung von Paaren. Ersetzen Sie einfach überall i
durch 0, so:
for(int j = 1; j < ar.length; j++) { int score = gcd(ar[0], ar[j]); // Make a copy int[] ar2 = new int[ar.length - 2]; int copy_k = 0; for(int k=1; k < ar.length; k++) { // Skip values that we already visited if(k == j) { continue; } ar2[copy_k] = ar[k]; copy_k += 1; } }
Das obige ist der detaillierte Inhalt vonFinden Sie GCD-Paare für ein bestimmtes Array. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Mit der Popularität von Kryptowährungen sind virtuelle Währungshandelsplattformen entstanden. Die zehn besten Handelsplattformen der virtuellen Währung der Welt werden nach dem Transaktionsvolumen und dem Marktanteil wie folgt eingestuft: Binance, Coinbase, FTX, Kucoin, Crypto.com, Kraken, Huobi, Gate.io, Bitfinex, Gemini. Diese Plattformen bieten eine breite Palette von Dienstleistungen, die von einer Vielzahl von Kryptowährungsauswahl bis hin zu Derivatenhandel reichen und für Händler unterschiedlicher Ebene geeignet sind.

Wie kann ich den Sesam offenen Austausch an Chinesisch anpassen? Dieses Tutorial behandelt detaillierte Schritte zu Computern und Android -Mobiltelefonen, von der vorläufigen Vorbereitung bis hin zu operativen Prozessen und dann bis zur Lösung gemeinsamer Probleme, um die Sesam -Open Exchange -Schnittstelle auf Chinesisch zu wechseln und schnell mit der Handelsplattform zu beginnen.

Es gibt viele Möglichkeiten, Bootstrap -Bilder zu zentrieren, und Sie müssen keine Flexbox verwenden. Wenn Sie nur horizontal zentrieren müssen, reicht die Text-Center-Klasse aus. Wenn Sie vertikal oder mehrere Elemente zentrieren müssen, ist Flexbox oder Grid besser geeignet. Flexbox ist weniger kompatibel und kann die Komplexität erhöhen, während das Netz leistungsfähiger ist und höhere Lernkosten hat. Bei der Auswahl einer Methode sollten Sie die Vor- und Nachteile abwägen und die am besten geeignete Methode entsprechend Ihren Anforderungen und Vorlieben auswählen.

Zu den zehn Top -Kryptowährungsplattformen gehören: 1. OKX, 2. Binance, 3. Gate.io, 4. Kraken, 5. Huobi, 6. Coinbase, 7. Kucoin, 8. Crypto.com, 9. Bitfinex, 10. Gemini. Sicherheit, Liquidität, Handhabungsgebühren, Währungsauswahl, Benutzeroberfläche und Kundensupport sollten bei der Auswahl einer Plattform berücksichtigt werden.

Die Berechnung von C35 ist im Wesentlichen kombinatorische Mathematik, die die Anzahl der aus 3 von 5 Elementen ausgewählten Kombinationen darstellt. Die Berechnungsformel lautet C53 = 5! / (3! * 2!), Was direkt durch Schleifen berechnet werden kann, um die Effizienz zu verbessern und Überlauf zu vermeiden. Darüber hinaus ist das Verständnis der Art von Kombinationen und Beherrschen effizienter Berechnungsmethoden von entscheidender Bedeutung, um viele Probleme in den Bereichen Wahrscheinlichkeitsstatistik, Kryptographie, Algorithmus -Design usw. zu lösen.

Top Ten Ten Virtual Currency Trading Platforms 2025: 1. OKX, 2. Binance, 3. Gate.io, 4. Kraken, 5. Huobi, 6. Coinbase, 7. Kucoin, 8. Crypto.com, 9. Bitfinex, 10. Gemini. Sicherheit, Liquidität, Handhabungsgebühren, Währungsauswahl, Benutzeroberfläche und Kundensupport sollten bei der Auswahl einer Plattform berücksichtigt werden.

Eine sichere und zuverlässige Plattform für digitale Währung: 1. OKX, 2. Binance, 3. Gate.io, 4. Kraken, 5. Huobi, 6. Coinbase, 7. Kucoin, 8. Crypto.com, 9. Bitfinex, 10. Gemini. Sicherheit, Liquidität, Handhabungsgebühren, Währungsauswahl, Benutzeroberfläche und Kundensupport sollten bei der Auswahl einer Plattform berücksichtigt werden.

Empfohlene Safe Virtual Currency Software Apps: 1. OKX, 2. Binance, 3. Gate.io, 4. Kraken, 5. Huobi, 6. Coinbase, 7. Kucoin, 8. Crypto.com, 9. Bitfinex, 10. Gemini. Sicherheit, Liquidität, Handhabungsgebühren, Währungsauswahl, Benutzeroberfläche und Kundensupport sollten bei der Auswahl einer Plattform berücksichtigt werden.