2022年6月18日leetcode每日一题打卡——53.最大子数组和

一、题目描述与要求

53.最大子数组和

题目描述:

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

子数组 是数组中的一个连续部分。

示例:

示例1:

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

示例2:

输入:nums = [1]
输出:1

 示例3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

二、解题思路

总的思路:

给了一个整数数组,要找出其中具有最大和的连续子数组,那么就要从第一位开始与每一位相加,然后在加上下一个数之前比较加上这一个数的话是否比我本来就有的子数组和加上它要大,如果是则把这个数加上,如果不是则舍弃前面的已经计算的和,因为如果我前面的和已经是5,接着下一位是1的话,就代表还是增加的,是最大的,所以就加上,此时和等于6,但是如果nums[i]>5,那我就没有存储前面的和的必要,直接让和变成nums[i]就可以了。n的值只要符合上述规律,就是会将整个数组的元素进行相加或者替换,此时就需要另一个变量,用来存储访问每一个数之后n的值,最后只留最大的。

具体步骤:

1、定义两个变量n和m,一个用于存储每次访问完一个元素的和,一个用于存储最后最大的和。
2、利用for循环遍历整个数组,由于和初始化为nums[0],所以i的初始值为1。
3、判断已有的子数组和n加上nums[i]是否大于nums[i]本身,如果大于则加上它,如果小于则重置子数组和n=nums[i]。
4、判断目前子数组和n是否大于目前存储的最大和m,是的话进行替换让m=n,不是的话不改变m。
5、最后返回数组中最大和的连续子数组的最大和m。

三、具体代码

int maxSubArray(int* nums, int numsSize){
    int n=nums[0];//存储连续数字和
    int m=nums[0];//存储最大子数组和
    for(int i=1;i<numsSize;i++)//遍历整个数组
    {
        if(n+nums[i]>nums[i])//如果n加上这一个数比这个数本身大,则加上这个数
        {
            n+=nums[i];
        }
        else//如果n加上这个数没有目前这个数大,则让n等于这个数,也就是舍弃前面已有的子数组
        {
            n=nums[i];
        }
        if(m<n)//每次都进行比较,只有当目前的和大于前面存储的和才进行更换
        {
            m=n;
        }
    }
    return m;
}

猜你喜欢

转载自blog.csdn.net/m0_59800431/article/details/125344410