LeetCode 第53题,最大子序和

题目概述

  • 题目:力扣:53.最大子序和
  • 难易:简单
  • 内容:

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

    示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4]

    输出: 6

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-subarray

第一次思路

首先将数组类型分为三类:1.空数组 2.只有一个元素 3. 多个元素

  1. 空数组:返回0;
  2. 只有一个元素:最大子序和即为他本身
  3. 多个元素:
    ①. 将第一个元素记为和(sum)和最大的和(max)
    ②. 如果和大于0,则继续加上下一位数字,如果和小于零就将sum赋值为下一位数字
    ③. max保存的是到当前元素为止最大的子序和

Code

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum=nums[0];
            int max=nums[0];
        if(nums.size()==0)
            return 0;
        else if(nums.size()==1)
            return nums[0];
        else{

            for(int i(1);i<nums.size();i++){
                if(sum>0)
                    sum+=nums[i];
                else
                    sum=nums[i];
                if(max<sum)
                    max=sum;

            }

        }
      return max;
    }

};

测试 Submit

分析

在LeetCode分析中发现一个很有趣的描述为赌徒,下图为LeetCode的截图

改进

分治法
其实就是它的最大子序和有三种可能。在左半边,在右半边,第三种是穿过中间。对于左右边的序列,情况一样,因此可以用递归处理。中间部分的则可以直接计算出来。

改进Code

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result=INT_MIN;
        result = maxSubArraySum(nums,0,nums.size()-1);
        return result;
    }
    int maxSubArraySum(vector<int>& nums,int left,int right){
        if(left==right){
            return nums[left];
        }
        int mid = (left+right)/2;
        int leftSum = maxSubArraySum(nums,left,mid);
        int rightSum = maxSubArraySum(nums,mid+1,right);
        int midSum = midmaxSubArraySum(nums,left,mid,right);
        int result = max(leftSum,rightSum);
        result = max(result,midSum);
        return result;
    }
    int midmaxSubArraySum(vector<int>& nums,int left,int mid,int right){
        int sum=0;
        int leftSum=INT_MIN;
        int rightSum=INT_MIN;
        for(int i=mid;i>=left;i--){
            sum = sum+nums[i];
            leftSum = max(sum,leftSum);
        }
        sum=0;
        for(int i=mid+1;i<=right;i++){
            sum = sum+nums[i];
            rightSum = max(sum,rightSum);
        }
        return (leftSum+rightSum);
    }
};

改进Submit

收获总结

分治法是真的难理解啊啊啊啊啊!!!

原文地址:https://www.cnblogs.com/HanLongfeng/p/12050031.html

时间: 2024-08-16 16:32:34

LeetCode 第53题,最大子序和的相关文章

leetcode第53题最大子数和

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-subarray 给定一个整数数组 nums?,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释:?连续子数组?[4,-1,2,1] 的和最大,为?6. 思路:找到一个具有最大和的连续子数组肯定需要遍历整个数组 如果出现了负数那么肯定中途会有减小的可能 那么我们必须要用一

LeetCode第[53]题(Java):Maximum Subarray

题目:和最大的子序列 难度:Medium 题目内容: Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum. 翻译: 给定一个整数数组nums,找到相邻的子数组(至少包含一个数字),它的总和是最大的,并返回它的和. Example: Input: [-2,1,-3,4,-1,2,1

Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解. 定义:dp[i] 表示从起点到index=i的这个段内的最大子序和. 例如:dp[1] = 在[-2,1]这个区间里面的最大子序和,dp[1]=1 写出状态转移方程:dp[i

leetCode-最大子序和53

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解. ==========================方案=========================== 1 /** 2 * 53.Maximum Subarray(最大

代码题(25)— 最大子序和、最长上升子序列

1.53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. class Solution { public: int maxSubArray(vector<int>& nums) { if(nums.empty()) return 0; int res = nums[0]; int

【Leetcode】最大子序和

思路: 分治法.记最大子序和为maxResult,函数为int getMaxSub( *, * ) {}. 向量A= [a1, a2, a3, ...., ai, ai+1, a+2, ......, aj-1, aj], maxResult = max( maxresult(a1, ......, ai),  getMaxSub(*, i+1) ),其中sum(a1, ......, ai) <= 0. class Solution { public: int maxSubArray(vect

leetcode53. 最大子序和 &#127775;

题目: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6.进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解. 来源:力扣(LeetCode) 解答: leetcode优秀方案(来自力扣答案统计页,没有明确作者是谁,可留言告知): 1 class Solution: 2 "&qu

leetcode中第一题twosum问题解答算法的可行性证明

leetcode中第一题twosum问题解答算法的可行性证明 一.引入 关于leetcode中第一题twosum问题,网上已有不少高人做出过解答,并提出了切实可行的算法实现.我在解答该题时参考了博客http://www.zixue7.com/article-9576-1.html的解答.为让读者更直观地阅读和理解本文,先简要摘录以上博客的内容如下: 题目还原 Two Sum Given an array of integers, find two numbers such that they a

LeetCode第四题,Add Two Numbers

题目原文: You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6