2017-09-02 84 views
0

找出非負數的從陣列的最大子陣列。 子陣列應該是連續的。也就是說,通過選擇第二個和第四個元素並跳過第三個元素創建的子數組無效。獲取分段錯誤(矢量聲明)

最大子陣列在子陣列中的元素的總和來定義。如果sum(A)> sum(B),則子數組A大於子數組B.

這是我的解決方案:

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

如果我取消線BLA [X] = A [j]時,我得到分割誤差。有人可以解釋如何解決這個錯誤?我在某處看到堆棧中沒有足夠的空間。我不明白如何。 謝謝

+2

現在是學習如何使用調試器的時候。順便說一句,你的代碼是有缺陷的。 – WhiZTiM

+2

當你定義一個沒有特定大小的矢量時,它將是* empty *。其中的任何索引都將*超出界限*。 –

+0

@Someprogrammerdude那麼如果我不能爲索引賦值,我該如何賦值給一個向量呢? –

回答

0

您可以將大小傳遞給矢量對象,也可以調用它與大小爲0創建一個矢量對象默認的構造函數。

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

或者你可以聲明一個矢量,大小0:

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

因爲你嘗試存儲在一個未分配空間值。

爲了解決這樣的問題,使用push_back存儲和pop清除:

所以,你的例子可以是這樣的:

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

注意:與代碼中的註釋相反,其中的第二個將* not * seg-fault,因爲循環體將永遠不會被輸入。 'vecInt.size()'將爲零,因此,'i WhozCraig

+0

@WhozCraig:是的,謝謝!你是對的。我沒有真正注意到這一點。 – Raindrop7