面試題
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 ...