最大子陣列和(一維和二維)
阿新 • • 發佈:2018-12-12
經典演算法題。
【一維陣列】
一個有N個整數元素的一維陣列,最大連續的子陣列和是多少?
大致思路如下:首先定義一個變數儲存以某個元素結尾的最大陣列和。再定義一個變數儲存全域性的最大子陣列和。然後初始化,遍歷整個陣列,找出對應的值比較即可。
#include<stdio.h> int max(int a,int b) { if(a<b) return b; else return a; } int MAXARR(int *a,int len) { int mend=a[0]; int allmax=a[0]; for(int i=1;i<len;i++) { mend=max(a[i],mend+a[i]); allmax=max(allmax,mend); } return allmax; } int main() { int tar[]={-1,5,1,-1,4,-1,6}; int len=7; int res=MAXARR(tar,len); printf("the result is %d",res); }
【二維陣列】
基本思路:將二維轉換成一維,當確定一個矩陣的上下界a和c,然後即可把其中的每一列中的第a行和第c行之間的元素看成一個整體,然後利用一維陣列的思路做就可以了。
#include<stdio.h> int max(int a,int b) { if(a<b) return b; else return a; } int MAXARR(int *a,int len) { int mend=a[0]; int allmax=a[0]; for(int i=1;i<len;i++) { mend=max(a[i],mend+a[i]); allmax=max(allmax,mend); } return allmax; } int MAXARR2(int a[][3],int n,int m) { int last=a[0][0]; int res; //printf("%d\n",last); for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { int b[m]; for(int k=0;k<m;k++) { for(int p=i;p<=j;p++) { b[k]+=a[p][k]; } } res=MAXARR(b,m); printf("%d\n",res); if(res>last) { last=res; } } } return last; } int main() { int tar[][3]={{1,2,3},{3,-1,5},{5,-5,5},{4,-7,8}}; int n=4; int m=3; int res=MAXARR2(tar,n,m); printf("the result is %d",res); }