连续子数组的最大和

题目

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

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

题解

思路1

动态规划(/递归)

递归函数:

F(n) = nums[i] i =0 或 F(n-1) < 0

F(n) = num[i] + F(n-1) i ≠0 或 F(n-1) >= 0

按照上述函数写法:

时间复杂度: O(N ^ 2)- 空间复杂度: O(1)

public int FindGreatestSumOfSubArray(int[] array) {
   int max = Integer.MIN_VALUE;
   for (int i = 0;i< array.length ; i++){
           int tmp = FindGreatestSumOfSubArray(array,i);
        if (max < tmp)
            max = tmp;
      }
     return max;
}

public int FindGreatestSumOfSubArray(int[] array,int idx) {
    if (idx == 0)
        return array[0];

    int pre = FindGreatestSumOfSubArray(array,idx - 1);
    if (pre <= 0)
        return array[idx];
    else return pre + array[idx];
}

改成迭代,优化一下:

时间复杂度: O(N)- 空间复杂度: O(N)

public int FindGreatestSumOfSubArray(int[] array) {
    if (array.length == 0)
        return 0;

    int[] maxSum = new int[array.length];
    maxSum[0] = array[0];
    int res = maxSum[0];
    for (int i = 1; i < array.length; i++) {
        maxSum[i] = Math.max(array[i], maxSum[i - 1] + array[i]);
        if (res < maxSum[i])
            res = maxSum[i];
    }
    return res;
}

思路2

核心思想:当加上一个正数时,和会增加;当加上一个负数时,和会减少。所以在数组遍历的过程中,一边累加数组元素,一边比较累加结果和0的关系,如果累加结果是负数,则应当把累加结果抛弃,并将累加结果清零。

时间复杂度: O(N)- 空间复杂度: O(1)

public int maxSubArray(int[] nums) {
    if (nums.length == 0)
        return 0;

    int subSum = 0;
    int maxSum = Integer.MIN_VALUE;
    for (int i = 0; i < nums.length; i++) {
        if (subSum <= 0)
            subSum = nums[i];
        else subSum += nums[i];

        if (subSum > maxSum)
            maxSum = subSum;
    }
    return maxSum;
}
全部评论

相关推荐

饥饿的长颈鹿就要上岸...:简历五项结构 简历只放五项内容,顺序和格式如下: 一、个人信息 只写名字、电话、邮箱 不写性别、年龄、籍贯、政治面貌、微信等额外信息 二、教育经历 格式:学校名称 | 学历 | 专业 | 就读时间 从左到右排列,一行写完 如果专业和岗位对口,写1-2行主修课程;不对口就不写 学历如果不占优势,可以把教育经历放到简历靠后的位置 三、实习/项目经历 如果没有实习经历,全部写项目经历 每条经历格式:项目名 + 岗位名 + 任职时间段 下面写三到五条工作内容 每条工作内容开头必须用四个字概括,加粗,后面跟一条完整描述 所有描述必须用STAR法则来写(情境-任务-行动-结果) 每一条都要有数据支撑和具体成果 四、个人优势 可以写获得的奖项、证书 如果奖项不够,就写你熟练掌握的技能 每条也要有具体数据或成果支撑,不能空泛堆砌 五、整体要求 一页纸,不要超过一页 个人信息只写名字加电话邮箱 贝贝试一下这个方式写简历,我虽然没收到offer,至少收到了好几轮面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务