【C】课堂结对联系-求整数数组的子数组之和的最大值(党云龙、黄为)
生活随笔
收集整理的這篇文章主要介紹了
【C】课堂结对联系-求整数数组的子数组之和的最大值(党云龙、黄为)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 測試題目
求整數數組的子數組之和的最大值。 - 題目分析
首先是明確題目的目的:求最大值;其次是考慮子數組求和。這里將求最大值寫成一個單獨的函數。主函數未測試函數。這里用到了二重循環,時間復雜度為N^2. - 源代碼分析
#include"stdio.h"
#define MAXSIZE 100
/*int Max(int num[],int length) {int max=num[0];//int n;int sum=0;int flag=0;for(int j=0;j<length;j++){if(max<num[j])max=num[j]; }for(int k=0;k<length-1;k++){if(max<(num[k]+num[k+1]))max=(num[k]+num[k+1]);}for(int m=0;m<length-2;m++){if(max<(num[m]+num[m+1]+num[m+2]))max=(num[m]+num[m+1]+num[m+2]);}for(int n=0;n<length-3;n++){if(max<(num[n]+num[n+1]+num[n+2]+num[n+3]))max=(num[n]+num[n+1]+num[n+2]+num[n+3]);}for(int z=0;z<length-4;z++){if(max<(num[z]+num[z+1]+num[z+2]+num[z+3]+num[z+4]))max=(num[z]+num[z+1]+num[z+2]+num[z+3]+num[z+4]);}if(max<(num[0]+num[1]+num[2]+num[3]+num[4]+num[5]))max=(num[0]+num[1]+num[2]+num[3]+num[4]+num[5]);return max; }*/int Max(int num[],int length){int max=num[0];if(length<=0){printf("數組個數為零或負數,錯誤,默認MAX設為0");return 0;}for(int k=0;k<length;k++){if(num[k]==-858993460){printf("數組含為NULL,錯誤,默認MAX設為0");return 0;}}for(int i=0;i<length;i++){int sum=0;for(int j=i;j<length;j++){sum+=num[j];if(max<sum)max=sum;}}return max;} main() {//int num[]={-10,-12,1,-1,9,10};//int length=6;int num[MAXSIZE];int length;printf("輸入數組個數:");scanf("%d",&length);for(int x=0;x<length;x++)scanf("%d",&num[x]);/*for(int i=0;i<6;i++)printf("%d ",num[i]);*/printf("\n");printf("MAX:%d\n",Max(num,length)); }這里我進行了一些異常情況的處理
- 上課思路
- 擴展-線性實現
如何利用線性實現,首先要對整形數組進行分析:
1、零對于和沒有影響。
2、數組是全負的情況(若只有負數和零,則max=0)
? ?? for(int i=0;i<length;i++) {if(max<num[i])max=num[i]; }3、數組是全正的情況(含0)
for(int i=0;i<length;i++) {if(max<num[i])max=num[i]; }
?4、有正有負的情況
? ? ?首先是要順序尋找第一個大于零的整數,記錄下來數組下標,然后接著尋找下一個負數,得到負數段,也求和,得到一段正數段,求和,按照這種方法遍歷整個數組。
? ? ?對這些正數段與負數段進行判斷與求和,從而實現求出最大者。 -
線性實現
? ? ?待下回分解!
轉載于:https://www.cnblogs.com/feelwell/p/3592559.html
總結
以上是生活随笔為你收集整理的【C】课堂结对联系-求整数数组的子数组之和的最大值(党云龙、黄为)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: child pid xxx exit s
- 下一篇: UART通信协议