当前位置: 首页 > news >正文

leetcode 53.Maximum Subarray

分治法

//lSum表示[left,right]内以left为左端点的最大子段和
//rSum表示[left,right]内以right为右端点的最大字段和
//iSum表示[left,right]的区间和
int divide_conquer(int* nums,int left,int right,int *lSum,int *rSum,int *iSum){
    int maxSum;//表示[left,right]内的最大字段和
    if(left == right){
        *lSum = nums[left];
        *rSum = nums[left];
        *iSum = nums[left];
        maxSum = nums[left];
        return maxSum;
    }

    int mid = (left+right)/2;
    int lSumL,rSumL,iSumL;
    int maxSumL = divide_conquer(nums,left,mid,&lSumL,&rSumL,&iSumL);
    int lSumR,rSumR,iSumR;
    int maxSumR = divide_conquer(nums,mid+1,right,&lSumR,&rSumR,&iSumR);
    *iSum = iSumL + iSumR;
    *lSum = lSumL > (iSumL + lSumR) ? lSumL:(iSumL + lSumR);
    *rSum = rSumR > (iSumR + rSumL) ? rSumR:(iSumR + rSumL);
    maxSum = maxSumL > maxSumR ? maxSumL: maxSumR;
    if(maxSum < rSumL+lSumR)
        maxSum = rSumL+lSumR;
    return maxSum;
}

int maxSubArray(int* nums, int numsSize) {
    int lSum,rSum,iSum;
    return divide_conquer(nums,0,numsSize-1,&lSum,&rSum,&iSum);
}

动态规划

第一版

int maxSubArray(int* nums, int numsSize) {
    if(numsSize == 1)
        return nums[0];
    int *max_sub_sum = (int*)malloc(sizeof(int)*numsSize);
    max_sub_sum[0] = nums[0];
    int max_sum = nums[0];
    for(int i = 1;i < numsSize;i++){
        max_sub_sum[i] =  max_sub_sum[i-1] + nums[i] >= nums[i] ? 
        max_sub_sum[i-1] + nums[i]:nums[i];
        if(max_sub_sum[i] > max_sum)
            max_sum = max_sub_sum[i];
    }
    free(max_sub_sum);
    return max_sum;
}

分析发现,numsSize等于1的情况不用单独考虑,后面的逻辑可以涵盖这种情况:

int maxSubArray(int* nums, int numsSize) {
    int *max_sub_sum = (int*)malloc(sizeof(int)*numsSize);
    max_sub_sum[0] = nums[0];
    int max_sum = nums[0];
    for(int i = 1;i < numsSize;i++){
        max_sub_sum[i] =  max_sub_sum[i-1] + nums[i] >= nums[i] ? 
        max_sub_sum[i-1] + nums[i]:nums[i];
        if(max_sub_sum[i] > max_sum)
            max_sum = max_sub_sum[i];
    }
    free(max_sub_sum);
    return max_sum;
}

进一步分析,发现求max_sub_sum[i]的时候,只需要用到max_sub_sum[i-1],而不需要用到max_sub_sum数组i-1前面的元素,所以可以用一个pre_max_sub_sum取代max_sub_sum数组的作用,节省内存开销。

int maxSubArray(int* nums, int numsSize) {
    int pre_max_sub_sum = nums[0];
    int max_sum = nums[0];
    for(int i = 1;i < numsSize;i++){
        pre_max_sub_sum =  pre_max_sub_sum + nums[i] >= nums[i] ? 
        pre_max_sub_sum + nums[i]:nums[i];
        if(pre_max_sub_sum > max_sum)
            max_sum = pre_max_sub_sum;
    }
    return max_sum;
}

相关文章:

  • Docker学习--容器生命周期管理相关命令--run命令
  • Linux内核网络栈:数据发送流程解析
  • 每日壁纸更新 pc
  • 4.2 单相机引导机器人放料-仅考虑角度变化
  • FPGA实现4K MIPI视频解码H265压缩网络推流输出,基于IMX317+VCU架构,支持4K60帧,提供工程源码和技术支持
  • Unity启动画面去除教程:如何去除Unity的Splash Screen和水印
  • 嵌入式人工智能产品开发实战】(十八)—— 政安晨:小智AI的Websocket通信协议嵌入式终端代码解读
  • 《QDebug 2025年3月》
  • Qt中存储多规则形状图片
  • JAVA:利用 JSONPath 操作JSON数据的技术指南
  • 类的默认成员函数
  • 滤波---卡尔曼滤波
  • 《HarmonyOS Next开发进阶:打造功能完备的Todo应用华章》
  • USB有驱ID卡读卡器C#小程序开发
  • 【区块链安全 | 第二十三篇】单位和全局可用变量(一)
  • 基于Python的Django框架的手机购物商城管理系统
  • xcode项目配置只能竖屏显示
  • 【论文阅读】Dynamic Adversarial Patch for Evading Object Detection Models
  • Mac 本地化部署 dify
  • 031-valgrind
  • 建设网站的网站安全/模板建站公司
  • 怎么用自己的电脑做网站空间/seo查询爱站网
  • 米拓做的网站如何改代码/百度官方网站网址
  • 专做火影黄图的网站/jsurl转码
  • 上海免费网站建站模板/郑州百度推广代理公司
  • 三亚做网站的公司/40个免费靠谱网站