• LC:最大子数组和


    题目:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    方法一: 暴力法

    1. 取 i,j 用于标记位。i 用于记录从哪个位置开始连续,j 用于进行连续。如:

    [0,1,2,3,4]     i 指向0

    j 指向0:0

    j 指向1:0,1

    j 指向2:0,1,2

    j 指向3:0,1,2,3

    j 指向4:0,1,2,3,4

    2. 取最大值max(初始值设为最小),sum为和值。sum用于计算从 i 到 j 位置中的所有数之和,并与max进行比较,如果大于max,则将sum值赋予max。

    3. 遍历数组,直到 i 值为数组中最后一位,计算出sum值,并与max值进行比较。 

    4. 返回max值。

    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #include<limits.h>
    4. #define InitSize 20
    5. typedef int ElemType;
    6. typedef struct{
    7. ElemType *data;
    8. int length;
    9. }SqList;
    10. // 初始化顺序表
    11. void initSqList(SqList &L){
    12. ElemType x;
    13. L.length = 0;
    14. L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
    15. printf("请输入顺序表(9999为终止):");
    16. scanf("%d",&x);
    17. while(x!=9999){
    18. L.data[L.length]=x;
    19. L.length++;
    20. scanf("%d",&x);
    21. }
    22. }
    23. // 打印顺序表
    24. void printSqList(SqList L){
    25. for(int i=0;i<L.length;++i)
    26. printf("%d ",L.data[i]);
    27. printf("\n");
    28. }
    29. // 最大子数组和
    30. ElemType maxSubArray(SqList L){
    31. ElemType max = INT_MIN; //INT_MIN需要引入limits.h头文件
    32. ElemType sum;
    33. for(int i=0;i<L.length;i++){
    34. sum = 0;
    35. for(int j=i;j<L.length;j++){
    36. sum+=L.data[j];
    37. if(max<sum)
    38. max=sum;
    39. }
    40. }
    41. return max;
    42. }
    43. void main(){
    44. ElemType res;
    45. SqList L;
    46. initSqList(L);
    47. printSqList(L);
    48. res = maxSubArray(L);
    49. printf("最大和为:%d\n",res);
    50. }

    示例1: 

    子数组:[5,4,-1,7,8] 

    示例2:

    子数组:[4,-1,2,1] 

    方法二:动态规划

    思想:每一步都是在预设之后的最大值

    1. 设置result为最终结果值;

    2. 每一步,可以和前面合并,也可以不和前面合并,值放入dp数组中。

    3. 式子:

    dp[i] = max {dp[i-1] +nums[i] , nums[i]}

    result = max {dp[i] , result}

    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #include<limits.h>
    4. #define InitSize 20
    5. typedef int ElemType;
    6. typedef struct{
    7. ElemType *data;
    8. int length;
    9. }SqList;
    10. // 初始化顺序表
    11. void initSqList(SqList &L){
    12. ElemType x;
    13. L.length = 0;
    14. L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
    15. printf("请输入顺序表(9999为终止):");
    16. scanf("%d",&x);
    17. while(x!=9999){
    18. L.data[L.length]=x;
    19. L.length++;
    20. scanf("%d",&x);
    21. }
    22. }
    23. // 打印顺序表
    24. void printSqList(SqList L){
    25. for(int i=0;i<L.length;++i)
    26. printf("%d ",L.data[i]);
    27. printf("\n");
    28. }
    29. //求最大值
    30. ElemType getMax(ElemType a,ElemType b){
    31. return a>b?a:b;
    32. }
    33. // 最大子数组和
    34. ElemType maxSubArray(SqList L){
    35. ElemType dp[InitSize];
    36. ElemType result;
    37. dp[0] = L.data[0];
    38. result = L.data[0];
    39. for(int i=1;i<L.length;i++){
    40. dp[i]=getMax(L.data[i],dp[i-1]+L.data[i]);
    41. result=getMax(dp[i],result);
    42. }
    43. return result;
    44. }
    45. void main(){
    46. ElemType res;
    47. SqList L;
    48. initSqList(L);
    49. printSqList(L);
    50. res = maxSubArray(L);
    51. printf("最大和为:%d\n",res);
    52. }

    示例同方法一

  • 相关阅读:
    docker-network网络
    js-forEach方法遍历数组
    PHP_EOL不起作用或者无效的原因
    Spring事务失效常见场景
    使用Python实现3D曲线拟合
    Python-Flask,Anaconda结合Pycharm打造第一个“Hello World“程序
    Python模块psutil:系统进程管理与Selenium效率提升的完美结合
    【感恩系列】:说点事儿 以及 我把所有的粉丝放到了中国地图上啦~
    【T+】删除/取消畅捷通T+软件登录账套后的“查看认证”按钮
    国产ETL工具BeeDI 产品 之 全国连锁到集团总部 数据同步
  • 原文地址:https://blog.csdn.net/qq_61706112/article/details/125514309