前缀和的应用(求最大连续子数组的和)
2016-10-18 21:37
197 查看
Q:对于一个连续的数组,求其任意连续的子数组和的最大值。
分析:
1.对于此题,直接应用暴力求解的话,时间复杂度应为O(n^2).
2.此处应用时间复杂度为O(n)的算法来求解,即前缀和的处理。
首先,函数sum(i,j)表示数组从下标i到下标j的连续元素的和。容易想到:sum(i,j) = sum(0,j) - sum(0,i-1).所以求sum(i,j)的最大值就可以表示为求sum(0,j) - sum(0,i-1)
的最大值问题。显然sum(0,j)的时间复杂度为线性的。只需求出最大的sum(0,j)与最小的sum(0,i-1),(其中j >= i)两者之差即所求结果。
代码如下:
运行结果:
分析:
1.对于此题,直接应用暴力求解的话,时间复杂度应为O(n^2).
2.此处应用时间复杂度为O(n)的算法来求解,即前缀和的处理。
首先,函数sum(i,j)表示数组从下标i到下标j的连续元素的和。容易想到:sum(i,j) = sum(0,j) - sum(0,i-1).所以求sum(i,j)的最大值就可以表示为求sum(0,j) - sum(0,i-1)
的最大值问题。显然sum(0,j)的时间复杂度为线性的。只需求出最大的sum(0,j)与最小的sum(0,i-1),(其中j >= i)两者之差即所求结果。
代码如下:
//数组前缀和的处理 #include <stdio.h> int a[]={1,2,3,-1,-2,5,6}; int sum(int* arr)//求max(sum(0,j)) { int m,max = a[0],sum = 0; int len = sizeof(a) / 4; int i = 1,j = 0; for( m = 0; m < len; m++) { sum += a[m]; if(sum >= max) { max = sum; j = m; } } sum = 0,max = a[j]; for( i = j; i >=0; i --)//从a[0]到a[j]中找出最大值,即sum(i,j)最大值 { sum += a[i]; if(sum >= max) max = sum; } return max; } int main() { printf("寻找数组a的最大连续子数组和:\n"); int res; res = sum(a); printf("结果为:%d\n",res); }
运行结果:
相关文章推荐
- KMP算法 —— next 数组的应用 --- 前缀中最小循环节,最大重复次数
- KMP算法 —— next 数组的应用 --- 前缀中最小循环节,最大重复次数
- KMP算法 —— next 数组的应用 --- 前缀中最小循环节,最大重复次数
- // 应用递归的方法 求一个数组的最大值
- 二维数组中,值最大的连续子数组
- 求连续子数组的最大和
- 微软100题-求连续子数组之和的最大值+题目变形
- 求连续子数组的最大和O(n)解法之思路与Java实现
- 连续子数组的最大和
- 连续子数组的最大和 动态规划实现
- [动态规划]最大连续子数组和的四种算法
- 求数组中最大连续子数组
- 面试趣题:求不连续子数组最大和的值
- 求连续子数组最大和
- 求连续子数组最大和,两种算法
- 宏的简单应用(得出数组中的最大值)
- C#求数组中和最大的连续子数组
- 连续子数组最大和问题(能够处理全是负数,返回子数组的起止索引的O(N)算法)
- 给定数组,查找最小的k个元素或最大的k个元素 快速排序算法灵活应用
- C#--第2周实验--任务8--编写一个控制台应用--输入10个数存入数组,求最大值、最小值和平均值