题目:
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
暴力法:
#include<stdio.h>
int max(int max1,int sum){
if(max1<sum){
return sum;
}
return max1;
}
int main(){
int nums[]={-2,1,-3,4,-1,2,1,-5,4};
int numsSize=9;
int i=0,j=0;
int a[100000];
for(i=0;i<numsSize;i++){
int sum=0;
sum+=nums[i];
int max1=sum;
for(j=i+1;j<numsSize;j++){
sum+=nums[j];
max1=max(max1,sum);
}
a[i]=max1;
}
int max2=a[0];
for(i=0;i<numsSize;i++){
if(a[i]>max2){
max2=a[i];
}
}
printf("%d",max2);
return 0;
}
动态规划:(但我还不知道动态规划具体是个啥)
这个方法相比于上面的方法更牛逼,不是一股脑地依次累加起来,然后分别比较谁大;
而是在累加之前,先比较累加后的和是否比要加的数大,如果累加后的和更小,就果断放弃,然后取这个要加的数;如果累加后的和更大,就取这个累加后的数。最后,再比较这些dp值,取最大的即为答案。
#include<stdio.h>
int max(int a,int b){
if(a>b){
return a;
}
return b;
}
int main(){
int nums[]={-2,1,-3,4,-1,2,1,-5,4};
int numsSize=9;
int max1=nums[0];
int dp=0;
int i=0;
for(i=0;i<numsSize;i++){
dp+=nums[i];
dp=max(dp,nums[i]);
max1=max(max1,dp);
}
printf("%d",max1);
return 0;
}