一、問題描述算法
在數組中,有正數,負數,0,求其最大子數組和?數組
算法思想:窮舉的解法,找出全部的子數組和,利用3層for循環;ide
去冗餘--->貪心算法,將小於0的子數組直接淘汰,由於以前已經保存過最大子數組值了;spa
二、暴力破解blog
#include<stdio.h> //求最大子數組和,暴力破解法,時間複雜度:O(n^3) int maxSubArray(int *a, int n); int maxSubArray(int *a, int n){ int i; int j; int k; int ans = -100000000; for(i = 0; i < n; i++){ for(j = i; j < n; j++){ int sum = 0; for(k = i; k <= j; k++){ sum += a[k]; } if(sum > ans){ ans = sum; } } } return ans; } void main(void){ int a[] = {1, -2, -3, 3, 5, 6, -1}; int count = sizeof(a)/sizeof(int); int maxNumber; maxNumber = maxSubArray(a, count); printf("%d\n", maxNumber); }
結果截圖get
三、貪心算法it
#include<stdio.h> //最大子數字和:貪心算法,時間複雜度爲:O(n) int maxSubArray(int *a, int n); int maxSubArray(int *a, int n){ int i; int ans = -10000000; int sum = 0; for(i = 0; i < n; i++){ sum += a[i]; if(sum > ans){ ans = sum; //保存先前的最大值 } if(sum < 0){ sum = 0; //將一部分和<0的直接刪去 } } return ans; } void main(void){ int a[] = {-1, -2, 3, 6, -6, 3, 3, 2, -3}; int count = sizeof(a)/sizeof(int); int maxNumber; maxNumber = maxSubArray(a, count); printf("%d\n", maxNumber); }
結果截圖io