Maximales Sub-Array


21

Definieren Sie das "maximale Unterarray" eines bestimmten Arrays als "ein (aufeinanderfolgendes) Unterarray mit der größten Summe". Beachten Sie, dass es keine "Nicht-Null" -Anforderung gibt. Gib diese Summe aus.

Geben Sie nach Möglichkeit eine Beschreibung Ihres Codes an.

Beispieleingang 1:

1 2 3 -4 -5 6 7 -8 9 10 -11 -12 -13 14

Beispielausgabe 1: 24

Beschreibung 1:
Die größte Summe ergibt sich durch Ausschneiden 6 7 -8 9 10und Aufsummieren.

Beispiel Eingabe 2: -1 -2 -3
Beispiel Ausgabe 2: 0
Beschreibung 2: Es ist einfach :) Ein leeres Subarray ist das "größte".

Anforderung:

  • Lies nichts außer stdin und die Ausgabe sollte auf stdout gehen.
  • Standard Lücken Einschränkungen gelten.

Ranking: Das kürzeste Programm gewinnt diesen .


5
Schreiben Sie ein Programm, das so kurz wie möglich ist. Ich würde empfehlen, diese Anforderung zu entfernen, da wir jedes mögliche Programm in unserer Sprache überprüfen und sicherstellen müssen, dass wir das kürzeste verwenden.
Okx

Anforderung 2 ist ebenfalls unklar. Bedeutet das Bibliotheken? Benutzerdefinierte Bibliotheken? Programm auslagern? Letzteres ist durch die Standard-Regelungslücken bereits verboten.
Undichte Nonne

14
Lies nichts außer stdin und schreibe nirgendwo anders als in stdout. - Warum?
Mr. Xcoder

2
Sehr ähnlich , möglicherweise ein Betrüger. Auch sehr ähnlich .
Xnor

Antworten:


10

Schale , 6 4 Bytes

▲ṁ∫ṫ

Probieren Sie es online!

      -- implicit input (list) xs  - eg. [-1,2,3]
   ṫ  -- get all tails of xs       -     [[-1,2,3],[2,3],[3],[]]
 ṁ∫   -- map & concat cumsum       -     [0,-1,1,4,0,2,5,0,3,0]
▲     -- get maximum               -     5


4

Pyth , 8 Bytes

eS+0sM.:

Probieren Sie es online!


Wie?

eS + 0sM .: Q - Q ist implizit, dh Eingabe. Nehmen wir an, es ist [-1, -2, -3].

      .: - Alle zusammenhängenden nicht leeren Unterlisten. Wir haben [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]].
    sM - Ermittelt die Summe jeder Unterliste. [-1, -2, -3, -3, -5, -6]
  +0 - Hängt eine 0 an die Summenliste an. [0, -1, -2, -3, -3, -5, -6]
eS - Maximales Element. S gibt uns [-6, -5, -3, -3, -2, -1, 0], während e 0, das letzte Element, zurückgibt.



3

C ++, 197 195 187 Bytes

-10 Bytes dank Zacharý

#include<vector>
#include<numeric>
int f(std::vector<int>v){int i=0,j,t,r=0;for(;i<v.size();++i)for(j=i;j<v.size();++j){t=std::accumulate(v.begin()+i,v.begin()+j,0);if(t>r)r=t;}return r;}

Können Sie die Klammern nach der ersten for-Schleife entfernen?
Zacharý

Auch warum hast du lund hsowieso?
Zacharý

@ Zacharý l und h war für den Start- und
Endindex

3

R , 54 Bytes

a=b=0;for(x in scan()){a=max(x,a+x);b=max(a,b)};cat(b)

Probieren Sie es online!

Algorithmus entnommen aus: Maximales Subarray-Problem

R , 65 Bytes

y=seq(x<-scan());m=0;for(i in y)for(j in y)m=max(m,sum(x[i:j]));m

Probieren Sie es online!

  • Lesen Sie xvon stdin.
  • Stellen Sie yals Index x.
  • Iterieren Sie zweimal über alle möglichen nicht leeren Teilmengen.
  • Vergleichen Sie die Summe einer Teilmenge mit m(anfangs m=0).
  • Speichern Sie den Maximalwert in m.
  • Druckwert von m.

R , 72 Bytes

n=length(x<-scan());m=0;for(i in 1:n)for(j in i:n)m=max(m,sum(x[i:j]));m

Probieren Sie es online!

  • Lesen Sie xvon stdin.
  • Führen Sie eine vollständige Suche über alle möglichen nicht leeren Teilmengen durch.
  • Vergleichen Sie die Summe einer Teilmenge mit m(anfangs m=0).
  • Speichern Sie den Maximalwert in m.
  • Druckwert von m.

Andere erfolglose Ideen

58 Bytes

Reduce(max,lapply(lapply(seq(x<-scan()),tail,x=x),cumsum))

63 Bytes

Reduce(max,lapply(seq(x<-scan()),function(i)cumsum(tail(x,i))))

72 Bytes

m=matrix(x<-scan(),n<-length(x),n);max(apply(m*lower.tri(m,T),2,cumsum))

1
a=b=0funktioniert auch. Außerdem müssen Sie das Drucken der Ausgabe erledigen. Wenn es als vollständiges Programm (durch source) ausgeführt wird, wird nichts gedruckt.
JAD

@ JarkoDubbeldam, habe ich hinzugefügt cat(b), aber wenn es mit echo=TRUEihm bezogen wird, ist es genug, bum den Ausdruck anzufordern .
Djhurio

Ich vermute, es gibt keine klare Definition, wie vollständige Programme in R ausgeführt werden. In der Befehlszeile befindet sich rscript und in R selbst source. Normalerweise sind jedoch Flags, die zum Ausführen eines Skripts erforderlich sind, im bytecount enthalten. (Ich persönlich habe es nicht geschafft, dass das Skript mit dem Scan gut funktioniert, aber das ist eine andere Sache.
JAD

Sie können verwendet werden T=Fanstelle von a=b=0zwei Bytes zu speichern, weil maxzwingen wird bzu numeric.
Giuseppe

3

Haskell , 28 Bytes

maximum.scanl((max<*>).(+))0

Probieren Sie es online!


Ist das Maximum nicht immer das letzte Element in dem zurückgegebenen Wert von scanl? also foldl((max<*>).(+))0??
Matthias

NVM Ich sehe meinen Fehler!
Matthias

@matthias Wenn du den Bearbeitungsverlauf siehst, wirst du sehen, dass ich den Fehler gemacht habe. :-)
H.PWiz




1

Japt , 11 Bytes

£ãY mxÃc rw

Probieren Sie es online!

Erläuterung

£ãY mxÃc rw
m@ãY mx} c rw   // Ungolfed
m@     }        // Map the input array by the following function, with Y=index
  ãY            //   Get all subsections in input array length Y
     mx         //   Sum each subsection
         c rw   // Flatten and get max

Alternative Methode, 11 Bytes

Aus @ETHproductions; basierend auf der Antwort von Brute Forces 'Husk .

£sY å+Ãc rw

Ruft alle Endpunkte des Eingabearrays ab und summiert sie kumulativ. Dann wird das Array abgeflacht und die max.

Probieren Sie es online!


Schön, wirklich schön. Ich habe nicht versucht, diese Herausforderung zu implementieren, als ich sie zuvor gesehen habe, aber ich habe mir eine andere Technik überlegt und erwartet, dass sie etwa 15 Byte lang ist. Das ist also großartig.
ETHproductions

Mit Blick auf die Antwort von Husk gibt es einen anderen effizienten Weg: £sY å+Ãc rw(ebenfalls 11 Bytes)
ETHproductions

@ETHproductions Ziemlich nett, das werde ich als alternative Methode zu dieser Antwort hinzufügen. Könnte das vielleicht mit einer Kombination aus Reduzieren / Konzentrieren verbessert werden, auch wie diese Husk-Antwort?
Justin Mariner


1

JavaScript, 58 Byte

m=Math.max;x=y=>eval("a=b=0;for(k of y)b=m(a=m(a+k,k),b)")

Golfed JS-Implementierung von Kadanes Algorithmus. So kurz wie möglich gemacht. Offen für konstruktive Vorschläge!

Was ich aus diesem Beitrag gelernt habe: Rückgabewert von eval- wenn seine letzte Anweisung eine forSchleife ist - ist im Grunde der letzte Wert, der in der Schleife vorhanden ist. Cool!

BEARBEITEN: Vier Bytes gespart dank Justins und Hermanns Vorschlägen.


Sie können das vermeiden , returndurch den Austausch {...;return b;}mit eval("...;b")da eval die letzte Anweisung gibt.
Justin Mariner

@JustinMariner danke! lerne hier immer etwas Neues :)
Gaurang Tandon

Sie können zwei weitere Bytes entfernen ;b, indem Sie sie entfernen , da sie von der for-Schleife zurückgegeben werden
Herman L

@HermanLauenstein Oh, wow, danke, das ist nützlich!
Gaurang Tandon




0

k , 14 Bytes

|/,/+\'(1_)\0,

Probieren Sie es online!

            0, /prepend a zero (in case we're given all negatives)
       (1_)\   /repeatedly remove the first element, saving each result
    +\'        /cumulative sum over each result, saving each result
  ,/           /flatten (fold concat)
|/             /maximum (fold max)

0

APL, 31 29 27 Bytes

⌈/∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕

Probieren Sie es online! (geändert, damit es auf TryAPL läuft)

Wie?

  • ∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕ Generieren Sie Summen von Subvektoren
  • ⌈/ Maximal

0

CJam, 24 Bytes

q~:A,{)Aew{:+}%}%e_0+:e>

Funktion, die ein Array von Zahlen als Eingabe verwendet.

Probieren Sie es online

q~:A   e# Store array in 'A' variable
,{)Aew e# Get every possible sub-array of the array
{:+}%  e# Sum every sub array
}e_    e# flatten array of sums
0+     e# Add zero to the array
:e>    e# Return max value in array

0

MEIN , 11 Bytes

⎕𝟚35ǵ'ƒ⇹(⍐↵

Probieren Sie es online! MY ist jetzt bei TIO! Woohoo!

Wie?

  • = ausgewerteter Eingang
  • 𝟚 = Subvektoren
  • 35ǵ'= chr(0x53)(Σ, Summe)
  • ƒ = string als MY-Funktion
  • = Karte
  • ( = bewerben
  • = maximal
  • = Ausgabe mit einem Zeilenumbruch.

Die Summe wurde ( 0bei leeren Arrays) korrigiert, damit dies funktioniert. Produkt wurde auch behoben.


0

J, 12 Bytes

[:>./@,+/\\.

Ähnlich wie bei der K-Lösung von zgrep: Die Scan-Summe aller Suffixe (ergibt eine Matrix), raze, take max

Probieren Sie es online!

HINWEIS

Für nicht zu viele Bytes erhalten Sie eine effiziente Lösung (19 Bytes Golf):

[: >./ [: ({: - <./)\ +/\

0

Axiom, 127 Bytes

f(a:List INT):Complex INT==(n:=#a;n=0=>%i;r:=a.1;for i in 1..n repeat for j in i..n repeat(b:=reduce(+,a(i..j));b>r=>(r:=b));r)

Dies wäre O (# a ^ 3) Algo; Ich kopiere es aus dem C ++ ein ... Ergebnisse

(3) -> f([1,2,3,-4,-5,6,7,-8,9,10,-11,-12,-13,14])
   (3)  24
                                                    Type: Complex Integer
(4) -> f([])
   (4)  %i
                                                    Type: Complex Integer
(5) -> f([-1,-2,3])
   (5)  3
                                                    Type: Complex Integer

0

Scala, 105 Bytes

val l=readLine.split(" ").map(_.toInt);print({for{b<-l.indices;a<-0 to b+2}yield l.slice(a,b+1).sum}.max)

Ich fand keinen besseren Weg , um die Unter erzeugen Listen Arrays.


0

Java 8, 242 Bytes

import java.util.*;v->{List a=new Stack();for(String x:new Scanner(System.in).nextLine().split(" "))a.add(new Long(x));int r=0,l=a.size(),i=l,j,k,s;for(;i-->0;)for(j=l;--j>1;r=s>r?s:r)for(s=0,k=i;k<j;)s+=(long)a.get(k++);System.out.print(r);}

Probieren Sie es hier aus.

106 Bytes ohne Verwendung der STDIN / STDOUT-Anforderung ..>.>

a->{int r=0,l=a.length,i=l,j,k,s;for(;i-->0;)for(j=l;--j>1;r=s>r?s:r)for(s=0,k=i;k<j;s+=a[k++]);return r;}

Probieren Sie es hier aus.

Erläuterung:

import java.util.*;      // Required import for List, Stack and Scanner

v->{                     // Method with empty unused parameter and no return-type
  List a=new Stack();    //  Create a List
  for(String x:new Scanner(System.in).nextLine().split(" "))
                         //  Loop (1) over the STDIN split by spaces as Strings
    a.add(new Long(x));  //   Add the String converted to a number to the List
                         //  End of loop (1) (implicit / single-line body)
  int r=0,               //  Result-integer
      l=a.size(),        //  Size of the List
      i=l,j,k,           //  Index-integers
      s;                 //  Temp sum-integer
  for(;i-->0;)           //  Loop (2) from `l` down to 0 (inclusive)
    for(j=l;--j>1;       //   Inner loop (3) from `l-1` down to 1 (inclusive)
        r=               //     After every iteration: change `r` to:
          s>r?           //      If the temp-sum is larger than the current `r`:
           s             //       Set `r` to the temp-sum
          :              //      Else:
           r)            //       Leave `r` the same
      for(s=0,           //    Reset the temp-sum to 0
          k=i;k<j;)      //    Inner loop (4) from `i` to `j` (exclusive)
        s+=(long)a.get(k++);
                         //     Add the number at index `k` in the List to this temp-sum
                         //    End of inner loop (4) (implicit / single-line body)
                         //   End of inner loop (3) (implicit / single-line body)
                         //  End of loop (2) (implicit / single-line body)
  System.out.print(r);   //  Print the result to STDOUT
}                        // End of method
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.