连续子数组的最大和

来源:互联网 发布:电视机看电视软件 编辑:程序博客网 时间:2024/05/01 11:26
    题目:输入一个整型数组,数组里面有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为o(n)。    解析:例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。    方法一:时间复杂度为o(n*n*n)的解法,枚举数组的所有子数组并求出它们的和。
int FindGreatestSumOfSubArray(vector<int> &ve){int sumMax = -1;for (int k = 0; k < ve.size(); ++k){for (int i = 0; i < ve.size() - k; ++i){int sumCur = 0;for (int j = i; j < ve.size() - k; ++j){sumCur += ve[j];}if (sumMax < sumCur){sumMax = sumCur;}}}return sumMax;}
方法二:时间复杂度为o(n*n)的解法,同样也是枚举所有的情况,用到了上一次求值的结构。把o(n*n*n)降低为o(n*n)。
int FindGreatestSumOfSubArray(vector<int> ve){int size = ve.size();int sum_max = 0x80000000;for (int i = 0; i < size; ++i){int sum_cur = 0;for (int j = i; j < size; ++j){sum_cur += ve[j];if (sum_max < sum_cur)sum_max = sum_cur;}}return sum_max;}
方法三:时间复杂度为o(n)。
int FindGreatestSumOfSubArray(vector<int> array) {int size = array.size();//数组长度为0时,返回0if(size == 0)return 0;//当前连续子数组的最大和int sum_max = 0x80000000;//以当前元素结尾的连续子数组最大和int sum_sub_max = 0;for(int i = 0; i < size; ++i){if(sum_sub_max <= 0){sum_sub_max = array[i];}else{sum_sub_max += array[i];}if(sum_max < sum_sub_max){sum_max = sum_sub_max;}}return sum_max;    }
0 0
原创粉丝点击