微软面试100题系列-数组连续和最大
2014-02-15 03:05
295 查看
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为 O(n)。
例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,
因此输出为该子数组的和 18。
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为 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]; else sum = 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) )); }
相关文章推荐
- 【从零单排之微软面试100题系列】03之求子数组的最大和
- 微软面试100题系列---求子数组的最大和
- 微软等数据结构+算法面试100题(44)-- 求子数组的最大和
- (微软面试100题)求子数组的最大和
- 微软面试(3/100)--求子数组的最大和
- 微软面试100题之三 求子数组的最大和
- 【从零单排之微软面试100题系列】11之二叉树中结点的最大距离
- 微软面试100题之第三题:求子数组的最大和
- 【微软谷歌面试100题--【45】一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
- 微软等数据结构+算法面试100题(15)--求最大连续递增数字串
- 微软面试100题系列---调整数组顺序,使奇数位于偶数之前
- 微软面试100题系列---最大二维子矩阵和
- 【从零单排之微软面试100题系列】14之数组中和为s的两个数字
- 求子数组的最大和 【微软面试100题 第三题】
- 微软等面试100题筛选答案-3-求子数组最大和
- 微软面试100题系列---求二叉树中节点的最大距离
- 求子数组的最大和 【微软面试100题 第三题】
- 【从零单排之微软面试100题系列】02之包含 min 函数的栈
- 关于本微软等公司数据结构+算法面试100题系列的郑重声明
- 求一个矩阵中最大的二维矩阵 【微软面试100题 第三十五题】