微软面试100题之第三题:求子数组的最大和
2014-04-13 19:32
323 查看
3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
ANSWER:
A traditional greedy approach.
Keep current sum, slide from left to right, when sum < 0, reset sum to 0.
int maxSubarray(int a[], int size) {
if (size<=0) error(“error array size”);
int sum = 0;
int max = - (1 << 31);
int cur = 0;
while (cur < size) {
sum += a[cur++];
if (sum > max) {
max = sum;
} else if (sum < 0) {
sum = 0;
}
}
return max;
}
接下来我给出几个时间复杂度不同的C++算法,仅供参考。
接下来给出一个时间复杂度为O(N)的好算法,与C语言编写的相似。
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
ANSWER:
A traditional greedy approach.
Keep current sum, slide from left to right, when sum < 0, reset sum to 0.
int maxSubarray(int a[], int size) {
if (size<=0) error(“error array size”);
int sum = 0;
int max = - (1 << 31);
int cur = 0;
while (cur < size) {
sum += a[cur++];
if (sum > max) {
max = sum;
} else if (sum < 0) {
sum = 0;
}
}
return max;
}
接下来我给出几个时间复杂度不同的C++算法,仅供参考。
int maxSubSum(const vector<int> & a) { int maxSum=0; for(int i=0;i<a.size();i++) { int thisSum=0; for(int j=i;j<a.size();j++) { thisSum+=a[j]; if(thisSum>maxSum) maxSum=thisSum; } } return maxSum; }可以看到此处用到了C++中的vector类,使用了for的两重循环,时间复杂度为O(N*N)。
接下来给出一个时间复杂度为O(N)的好算法,与C语言编写的相似。
int maxSubSum(const vector<int> & a) { int maxSum=0,thisSum=0; for(int j=0;j<a.size();j++) { thisSum+=a[j]; if(thisSum>maxSum) maxSum=thisSum; else if(thisSum<0) thisSum=0; } return maxSum; }
相关文章推荐
- 求子数组的最大和 【微软面试100题 第三题】
- 求子数组的最大和 【微软面试100题 第三题】
- 微软面试100题之三 求子数组的最大和
- 微软等数据结构+算法面试100题(44)-- 求子数组的最大和
- 【从零单排之微软面试100题系列】03之求子数组的最大和
- 微软等面试100题筛选答案-3-求子数组最大和
- 微软面试100题系列---求子数组的最大和
- (微软面试100题)求子数组的最大和
- 微软面试(3/100)--求子数组的最大和
- 【微软谷歌面试100题--【45】一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
- 微软100题第3题:求子数组的最大和
- 微软算法100题03 求子数组的最大和
- 面试100题:3.求子数组的最大和
- 【微软100题】003求子数组的最大和
- 微软面试100道之3 求子数组的最大和(数组)
- 微软面试100题系列-数组连续和最大
- 面试100题:3.求子数组的最大和
- 微软100题第三题(求子数组的最大和)
- H面试(23):求子数组最大和
- 旋转数组中的最小元素 【微软面试100题 第六十九题】