Inhaltsverzeichnis
Frageninhalt
Lösung
Heim Java Finden Sie GCD-Paare für ein bestimmtes Array

Finden Sie GCD-Paare für ein bestimmtes Array

Feb 22, 2024 pm 12:37 PM
最大公约数 排列

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
Nach dem Login kopieren

Beispiel 1:

arr = [3,4,9,5]
Nach dem Login kopieren

Antwort:

4
Nach dem Login kopieren

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.
Nach dem Login kopieren

Beispiel 2:

arr = [1,2,3,4,5,6]
Nach dem Login kopieren

Antwort:

6
Nach dem Login kopieren

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.
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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;
  }
}

Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die zehn besten Handelsplattformen für virtuelle Währung? Was sind die zehn besten Handelsplattformen für virtuelle Währung? Feb 20, 2025 pm 02:15 PM

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.

So passen Sie den Sesam offenen Austausch in Chinesisch an So passen Sie den Sesam offenen Austausch in Chinesisch an Mar 04, 2025 pm 11:51 PM

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.

Muss ich Flexbox in der Mitte des Bootstrap -Bildes verwenden? Muss ich Flexbox in der Mitte des Bootstrap -Bildes verwenden? Apr 07, 2025 am 09:06 AM

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.

Top 10 Cryptocurrency -Handelsplattformen, Top Ten empfohlene Apps für Währungshandelsplattformen Top 10 Cryptocurrency -Handelsplattformen, Top Ten empfohlene Apps für Währungshandelsplattformen Mar 17, 2025 pm 06:03 PM

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.

Berechnung des C-Subscript 3-Index 5 C-Subscript 3-Index 5-Algorithmus-Tutorial Berechnung des C-Subscript 3-Index 5 C-Subscript 3-Index 5-Algorithmus-Tutorial Apr 03, 2025 pm 10:33 PM

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 10 Top -Currency -Handelsplattformen 2025 Cryptocurrency Trading Apps, die die Top Ten ringen Top 10 Top -Currency -Handelsplattformen 2025 Cryptocurrency Trading Apps, die die Top Ten ringen Mar 17, 2025 pm 05:54 PM

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.

Was sind die sicheren und zuverlässigen digitalen Währungsplattformen? Was sind die sicheren und zuverlässigen digitalen Währungsplattformen? Mar 17, 2025 pm 05:42 PM

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 sichere Apps mit sicheren Virtual Currency Software Top 10 Top 10 Digital Currency Trading Apps Ranking 2025 Empfohlene sichere Apps mit sicheren Virtual Currency Software Top 10 Top 10 Digital Currency Trading Apps Ranking 2025 Mar 17, 2025 pm 05:48 PM

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.