微软面试100题系列-数组连续和最大

来源:互联网 发布:windows图形编程 pdf 编辑:程序博客网 时间:2024/06/06 00:30
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为 O(n)。
例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,
因此输出为该子数组的和 18。
#include <stdio.h>#include <stdlib.h>#define MIN_INT (1 << (sizeof(int) * 8 - 1) | 1)int max_sum(int * arr, int sz){int i, j, sum, max_sum = MIN_INT;int * p_tmp = (int *)malloc(sizeof(int) * sz);if(NULL == p_tmp || sz < 0)return MIN_INT;p_tmp[0] = arr[0];for(i = 1; i < sz; i++)p_tmp[i] = p_tmp[i - 1] + arr[i];for(i = 0; i < sz; i++){for(j = i; j < sz; j++){if(i == j)sum = arr[i];elsesum = p_tmp[j] - p_tmp[i];if(sum > max_sum)max_sum = sum;}}if(p_tmp != NULL)free(p_tmp);return max_sum;}int main(int c, char * v[]){int arr[] = {1, -2, 3, 10, -4, 7, 2, -5};printf("%d\n", max_sum(arr, sizeof(arr) / sizeof(int) ));}

0 0
原创粉丝点击