2017-09-02 1 views
0

Déterminez le sous-tableau maximum de nombres non négatifs d'un tableau. Le sous-réseau doit être continu. C'est-à-dire qu'un sous-groupe créé en choisissant les deuxième et quatrième éléments et en ignorant le troisième élément est invalide.Obtention d'une erreur de segmentation (déclaration vectorielle)

La sous-matrice maximale est définie en termes de somme des éléments du sous-réseau. Le sous-tableau A est supérieur au sous-tableau B si somme (A)> somme (B).

C'est ma solution:

vector<int> Solution::maxset(vector<int> &A) { 
// Do not write main() function. 
// Do not read input, instead use the arguments to the function. 
// Do not print the output, instead return values as specified 
// Still have a doubt. Checkout www.interviewbit.com/pages/sample_codes/ for more details 

    vector <int> bla; 
    int sum[100]={0}; 
    int k = 0; 
    int j = 1; 

    for (int i =0; i < A.size(); i++){ 
     if (A[i] > -1){ 
      sum[k] = A[i] + sum[k]; 
     } 
     else { 
      k++; 
     } 
    } 

    cout<<sum[0]<<" "; 
    cout<<sum[1]<<" "; 
    cout << sum[2] << " "; 

    int s = 0; 

    for (int i =0; i< 100; i++){ 
     if (s < sum[i]){ 
      s = sum[i]; 
      k = i; 
     } 
    } 

    cout << s; 

    int count = 0; 
    for (int i =0; i < A.size(); i++){ 
     if (A[i] < 0) { 
      count ++; 
     } 

     if (count == k) { 
      int j = i+1; 
      int x = 0; 
      while (A[j] > 0 && j< (A.size()-1)) { 
       // bla[x] = A[j]; 
       x++; 
       j++; 
      } 
     } 
    } 

    return bla; 
} 

Si je décommenter la ligne bla [x] = A [j], je reçois une erreur de segmentation. Quelqu'un peut-il expliquer comment décourager cette erreur? Je l'ai lu quelque part qu'il n'y a pas assez d'espace dans la pile. Je ne comprends pas comment. Merci

+2

maintenant est le bon moment pour apprendre à utiliser un débogueur. BTW, votre code est défectueux. – WhiZTiM

+2

Lorsque vous définissez un vecteur sans taille spécifique, il sera * vide *. Toute indexation dans ce sera * hors limites *. –

+0

@Someprogrammerdude puis comment attribuer des valeurs à un vecteur si je ne peux pas l'indexer? –

Répondre

0

Vous pouvez passer la taille à un objet vectoriel ou vous pouvez appeler son constructeur par défaut qui crée un objet vectoriel de taille 0.

std::vector<int> vecInt(10); 
for(int i(0); i < vecInt.size(); i++) 
    vecInt[i] = i; 

Ou vous pouvez déclarer un vecteur avec la taille 0:

std::vector<int> vecInt; 
vecInt[0] = 10; // segfault 

Parce que vous essayez de stocker des valeurs dans un espace alloué non.

Pour résoudre ce problème utiliser push_back pour stocker et pop à effacer:

Ainsi, votre exemple peut ressembler à ceci:

while (A[j] > 0 || j< (A.size()-1)) { 
    // bla[x] = A[j]; 
    bla.push_back(A[j]); 
    x++; 
    j++; 
} 
+1

Note: contrairement au commentaire en code, le second de ceux-ci * ne * segmentera pas car le corps de la boucle ne sera jamais entré. 'vecInt.size()' sera nul, et en tant que tel, 'i WhozCraig

+0

@WhozCraig: Oui merci! tu as raison. Je n'ai pas vraiment remarqué ça. – Raindrop7