Leetcode053

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

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

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


#### 解法一:暴力法

```cpp
class Solution
{
public:
    int maxSubArray(vector<int> &nums)
    {
        //类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值
        /***********************************************************************************
        INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中。
        因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31.C/C++中,
        所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。
        如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。
        **************************************************************************/
        int max = INT_MIN;  
        int numsSize = int(nums.size());
        for (int i = 0; i < numsSize; i++)
        {
            int sum = 0;
            for (int j = i; j < numsSize; j++)
            {
                sum += nums[j];
                if (sum > max)
                {
                    max = sum;
                }
            }
        }

        return max;
    }
};

解法二:贪心法

class Solution2
{
public:
    int maxSubArray(vector<int> &nums)
    {
        //类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值
        int result = INT_MIN;
        int numsSize = int(nums.size());
        int sum = 0;
        for (int i = 0; i < numsSize; i++)
        {
            sum += nums[i];
            result = max(result, sum);
            //如果sum < 0,重新开始找子序串
            if (sum < 0)
            {
                sum = 0;
            }
        }

        return result;
    }
};

解法三:两个标记动态寻找

/**************
两个标记动态寻找
该题要找到连续子数组的最大和,可用动态寻找
即定义两个变量presum、maxsum
一个动态选择的做加法
一个记录最大值
********************/
class Solution3
{
public:
    int maxSubArray(vector<int>& nums)
    {
        if (nums.empty())
            return 0;
        int presum = nums[0];
        int maxsum = presum;
        for (int i = 1; i < int(nums.size()); i++)
        {
            presum = presum > 0 ? presum += nums[i] : nums[i];
            maxsum = max(maxsum, presum);
        }
        return maxsum;
    }
};

main()函数

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int main()
{
    vector<int> nums;
    cout << "请输入数组的大小 Size: "<<endl;
    int Size;
    cin >> Size;
    int Currval;
    cout << "请输入数组的元素: " << endl;
    for (int i = 0; i < Size; i++)
    {
        cin >> Currval;
        nums.push_back(Currval);
    }

    Solution3 answer;
    cout << "最大连续子数组的和为: " << answer.maxSubArray(nums) << endl;

    system("pause");
    return 0;
}

   转载规则


《Leetcode053》 赵小亮 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Leetcode066 Leetcode066
LeetCode066:加一         给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0
2020-04-13
下一篇 
Leetcode035 Leetcode035
LeetCode035:搜索插入位置         给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复
2020-04-12
  目录