面試題31連續陣列的最大和

2021-07-04 21:26:48 字數 1484 閱讀 4374

面試題

31連續陣列的最大和

思路:最笨最直接的做法

列舉陣列的所有子陣列並求出它們的和。長度為

n的陣列一共有

n*(n-1)/2

個子陣列時間複雜度為

o(n^2)

// 遍歷陣列同時設立兩個變數

cursum

和maxsum

當cursum<=0

時跟新cursum

為當前元素值。每次更新最大值

maxsum

的值即可 //

用中規中矩的動態規劃法

用函式f(i)

表示以第

i個數字結尾的子陣列的最大和。目標函式為

max(f(i))

其中0<=i

//f(i)=a[i]  if(i==0||f(i-1)<=0)

//f(i)=f[i-1]+a[i] if(i!=0&&f(i-1)>0)

函式介面:

getgreastsumofsubarray(int*a,int length);

#include#include#includeusing namespace std;

//面試題31連續陣列的最大和 思路:最笨最直接的做法 列舉陣列的所有子陣列並求出它們的和。長度為n的陣列一共有n*(n-1)/2個子陣列時間複雜度為o(n^2)

// 遍歷陣列同時設立兩個變數cursum 和maxsum 當cursum<=0 時跟新cursum 為當前元素值。每次更新最大值maxsum的值即可

//用中規中矩的動態規劃法 用函式f(i)表示以第i個數字結尾的子陣列的最大和。目標函式為max(f(i)) 其中0<=i0)

bool ginvalidinput=false;

//方法一最直觀的做法

int getgreastestsumofsubarray(int a,int length)

int maxsum=0x80000000;//32位整形能表示的最小負整數

for(int i=0;imaxsum)}}

return maxsum;

}int getgreastestsumofsubarray2(int a,int length)

int cursum=0;

int maxsum=0x80000000;

for(int i=0;imaxsum)

}return maxsum;

}//用動態規劃來做。用函式f(i)表示以第i個數字結尾的子陣列的最大和。目標函式為max(f(i)) 其中0<=i0)

int getgreastestsumofsubarray3(int a,int length,int f,int *lastindex)//lastindex 為最大和的最後乙個累加數的陣列索引

f[0]=a[0];

for(int i=1;i0)

else

}int max=0x80000000,maxindex=-1;

for(int i=1;i

面試題31 連續子陣列的最大和

題目 輸入乙個整形陣列,陣列裡有正數也有負數,陣列中乙個或連續的多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 例如,輸入陣列 1,2,3,10,4,7,2,5 和最大的子陣列微3,10,4,7,2,因此輸出該子陣列的和18 思路 1,分析陣列規律 初始化和0,第一哥數字1...

面試題31 連續子陣列的最大和

面試題31 連續子陣列的最大和 hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量...

面試題31連續子陣列的最大和

題目 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續的多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間負責度為o n 看到這個題目,我們首先想到的是求出這個整型陣列所有連續子陣列的和,長度為n的陣列一共有 n n 2 2個子陣列,因此要求出這些連續子陣列的和最快也需要o n 2 ...