zoukankan      html  css  js  c++  java
  • LeetCode T53.Maximum Subarray/最大子序和

     这类题目的往往可以采用暴力穷举的办法,但其时间复杂度过高。因此,这里采用动态规划的方法求解。设定一个状态集合dp[numsSize]与nums[numsSize]一一对应,对dp[0]初始化为nums[0],之后的每一个状态都赋值为max{nums[i], nums[i]+dp[i-1]},这里的意思就是每往后扫描一个元素,返回该元素或该元素和前一状态的和,也就是说只有该元素为正值,才会引起dp的增加,否则dp与nums保持一致,抛弃之前求和很小的状态。因为这里我设了一个dp数组,因此空间复杂度为O(n),当然由于每次dp值的更新只需要其前一个值,最后结果并不需要回头查询每个状态,因此可以优化为O(1)的空间复杂度。对于时间复杂度,从循环来看,只需要对数组中的元素遍历一次,时间复杂度为O(n).

    我的题解代码如下,leetcode上运行时间4ms,内存占用6MB

    #define MIN_NUM -9999
    
    int maxSubArray(int *nums,int numsSize){
        int maxSum=MIN_NUM;
        int *dp=(int *)malloc(sizeof(int)*numsSize);
        dp[0]=nums[0];
        maxSum=dp[0];
        for(int i=1;i<numsSize;i++){
            dp[i]=(dp[i-1]+nums[i])>nums[i]?(dp[i-1]+nums[i]):nums[i];
            maxSum=dp[i]>maxSum?dp[i]:maxSum;
        }
        return maxSum;
    }
  • 相关阅读:
    素数筛的2种方法
    c++含结构体的sort()使用
    构建c++二维vector
    c语言输入单字符避免回车的四种方法
    menset()在c++中的作用
    杭电oj hud1092 1093 活用EOF&n--
    EOF在while(scanf("%d",&n))中的作用
    KMP算法
    图解HTTP(3)
    图解HTTP(2)
  • 原文地址:https://www.cnblogs.com/runsdeep/p/12820733.html
Copyright © 2011-2022 走看看