53、最大子序和

题目

【学习计划 - 数据结构 - 第一天 - 数组】https://leetcode-cn.com/study-plan/data-structures/

https://leetcode-cn.com/problems/maximum-subarray/

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

程序样例

1
2
3
int maxSubArray(int* nums, int numsSize){

}

我的解答

关键代码

第一版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int maxSubArray(int* nums, int numsSize){
int maxnum=*(nums),sum=0;

for(int i=0;i<numsSize;i++){
sum += *(nums+i);
if(i-1>=0){
sum -= *(nums+i-1);
}
if(sum>maxnum){
maxnum = sum;
}
}
return maxnum;
}

成功版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int maxSubArray(int* nums, int numsSize){
int maxnum=*(nums),sum;

//i表示的是子串的长度
for(int i=1;i<=numsSize;i++){
sum =0;
for(int j=0;j<numsSize;j++){

sum += *(nums+j);
if(j-i>=0){
sum -= *(nums+j-i);
}
if(sum>maxnum){
maxnum = sum;
}
}
}
return maxnum;
}

思路:滑块。长度从1到最长。每向右滑一,减去最左边的那个元素。

第一版本为长度为1时的滑块,成功版本为长度从1到最长时的滑块。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int maxSubArray(int* nums, int numsSize){
int maxnum=*(nums),sum;

//i表示的是子串的长度
for(int i=1;i<=numsSize;i++){
sum =0;
for(int j=0;j<numsSize;j++){

sum += *(nums+j);
if(j-i>=0){
sum -= *(nums+j-i);
}
if(sum>maxnum){
maxnum = sum;
}
}
}
return maxnum;
}

main(){
int numsSize=5;
int nums[]={1,6,-2,-4,7};

int num = maxSubArray(nums,numsSize);
printf("--%d--\n",num);
}

复杂度分析

执行用时:908 ms, 在所有 C 提交中击败了5.15%的用户

内存消耗:6.2 MB, 在所有 C 提交中击败了79.89%的用户