数据结构——算法之(006)(求子数组的最大和)
2014-05-22 09:44
736 查看
【申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出。 联系邮箱:Mr_chenping@163.com】
题目:输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
题目分析:
一、如果数组中全部为负数,则返回最大负数值即可
二、当既有正数也有负数的时候:
(1)从左往右叠加,如果当前叠加值小于或者等于0,则放弃,叠加总和清0(加一个负数或者0是毫无意义的),从此位置继续重新叠加
(2)如果当叠加总和大于上一次记录的叠加总和,则更新叠加总和即可
算法实现:
题目:输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
题目分析:
一、如果数组中全部为负数,则返回最大负数值即可
二、当既有正数也有负数的时候:
(1)从左往右叠加,如果当前叠加值小于或者等于0,则放弃,叠加总和清0(加一个负数或者0是毫无意义的),从此位置继续重新叠加
(2)如果当叠加总和大于上一次记录的叠加总和,则更新叠加总和即可
算法实现:
#include <stdio.h> int return_sub_max(int *array, int size) { int max_sum = array[0], temp = array[0]; int i = 1; for( ; i<size; i++) { temp += array[i]; if(temp > max_sum) { max_sum = temp; } if(temp <= 0) { temp = 0; } } return max_sum; } int main() { //int array[] = {-8, -2, -1, -3, -10, -4, -7, -2, -5}; //int array[] = {1, 2, 3, -2, -3, 9}; //int array[] = {1, -2, -3, 10, -4, 7, 2, -5}; int array[] = {1, -9, 3, 10, 4, 7, 2, 5}; int i = 0; int size = sizeof(array)/sizeof(int); for( ; i<size; ++i) printf("%d ", array[i]); printf("\nmax = %d\n", return_sub_max(&array[0], size)); return 0; }
相关文章推荐
- 数据结构与算法-求子数组的最大和
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- <跟着结构之法一起学算法>求子数组的最大和
- 数据结构与算法之动态数组实现堆栈
- 【数据结构与算法的语言基础】数组与字符串
- Pku acm 3041 Asteroids 数据结构题目解题报告(十六)---- 匈牙利算法求二分图的最大匹配
- 数据结构与算法之—数组(一)
- 求子数组的最大和【算法】
- 【算法总结-DP】求子数组的最大和
- 数据结构与算法2——数组
- 【数据结构与算法基础】以数组实现的循环队列 / Circular Queue implemented by array
- 求子数组和的最大值算法
- 算法--将数组分成和相等的多个子数组,求子数组的最大个数
- 数据结构——算法之(001)(在一个数组中找出重复数值)
- 求最大连续子序列之和的线性算法 c# 数据结构
- Pku acm 2536 Gopher II 数据结构题目解题报告(十四)---- 匈牙利算法求二分图的最大匹配
- 【算法07】求子数组的最大和
- 算法题13 求子数组的最大和
- 人人都来写算法 之 求子数组的最大和