首页 > 其他分享 >53. 最大子数组和(力扣)

53. 最大子数组和(力扣)

时间:2023-04-16 18:23:39浏览次数:43  
标签:maxSubArray nums int Solution 53 class 力扣 数组 public

https://leetcode.cn/problems/maximum-subarray/

1.暴力+前缀和

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        const int N = 1e5+10;
        int sums[N];
        for(int i=0;i<nums.size();i++)
            if(i==0)sums[i]=nums[i];
            else sums[i]=sums[i-1]+nums[i];
        int maxn=-1e6+10;
        for(int i=0;i<nums.size();i++)
        {
            for(int j=i;j<nums.size();j++)
            {
                int t=0;
                if(i==0)t=sums[j];
                else t=sums[j]-sums[i-1];
                if(t>maxn)maxn=t;
            }
        }
        return maxn;
    }
};

2.区间和+贪心,一旦区间和小于0直接抛弃,因为它对于以后的区间和的意义是负值

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxSum = nums[0];
        int sum = 0;
        for(int num : nums)
        {
            sum += num;
            if(maxSum<sum)maxSum=sum;
            if(sum < 0 )
                sum = 0;
        }
        return maxSum;
    }
};

3.前缀和,计算好前缀和后再计算一遍1~i区间的最小前缀和,这样就可以O(n)地计算所有最大区间和了,在所有的最大区间和中取一个max即可

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<long long>sum(n+1,0);
        for(int i=1;i<=n;i++)sum[i]=sum[i-1]+nums[i-1];
        vector<long long>pre(n+1,0);
        long long  ans=-1e10;
        pre[0]=sum[0];//边界条件
        for(int i=1;i<=n;i++)pre[i]=min(pre[i -1],sum[i]);
        for(int i=1;i<=n;i++)ans=max(ans,sum[i]-pre[i-1]);
        return ans;
    }
};

4.线性DP,从集合角度出发分析整个问题,f[i]表示以nums[i]为结尾的最大子数组和,f[i]由以nums[i-1]为结尾的序列+nums[i] 是整数 以及 以nums[i-1]为结尾的序列+nums[i]是负数 以及 nums[i]一个数为序列三种子集组成

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int>f(n+1,0);
        f[0]=nums[0];//边界条件
        int res=f[0];
        for(int i=1;i<n;i++)
        {
            f[i]=max(f[i-1]+nums[i],nums[i]);
            res=max(res,f[i]);
        }
        return res;
    }
};

 

标签:maxSubArray,nums,int,Solution,53,class,力扣,数组,public
From: https://www.cnblogs.com/lxl-233/p/17323768.html

相关文章

  • C++动态数组(vector.h)
    #include<iostream>#include<vector>intmain(){std::vector<std::string>con;con.push_back("9999");std::cout<<con[0];return0;}vector搞了一个多态,你可以随便赋值和数组一样,不过是动态的,读取的话vector有自带的比for更优雅的方式......
  • vue做多选,传递数组类型到后端
    1.需求:多选框选择多个类型,把选中的数据传递到后端当初在做多选框,直接用了element-ui里面的el-check-box属性,在官网里面说,是使用v-modol绑定数值来传递,好嘛,,,传的一直是true!!不是我想要的数据,也是很久没使用vue框架了,做的时候很是怀疑自己,使用value来绑值?使用v-model?使用v-bind???一直试......
  • 【前缀和】LeetCode 523. 连续的子数组和
    题目链接523.连续的子数组和思路参考宫水三叶大佬题解一开始以为和Leetcode53MaximumSubarray思路差不多,都是求子数组的值。但是后来发现在53题中并没有求出每个子数组的和,只是在贪心的情况下求出了可能的最大和代码classSolution{publicbooleancheckSubarra......
  • 数组
      数组扩容:调用的jvm中arraycopy(原,从哪开始,目标,目标起始位置,长度) ......
  • 实验4 数组应用编程
    task1_1#include<stdio.h>#defineN4intmain(){ inta[N]={2,0,2,3}; charb[N]={'2','0','2','3'}; inti; printf("sizeof(int)=%d\n",sizeof(int)); printf("sizeof(char)=%d\n",sizeo......
  • 数组中出现次数超过一半的数字
    classSolution{public:intmoreThanHalfNum_Solution(vector<int>&nums){intcnt=0,val=-1;//val给一个无效值即可for(autox:nums){if(!cnt)//投票最多人没了,接下来任何人都可以竞选{val=x;......
  • 寻找两个正序数组的中位数
    题目描述难度困难给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nums1=......
  • js 数组、对象转json 以及json转 数组、对象
    1、JS对象转JSON方式:JSON.stringify(obj)varjson={"name":"iphone","price":666};//创建对象;varjsonStr=JSON.stringify(json);//转为JSON字符串console.log(jsonStr);2、JS数组转JSON//数组转json串vararr=[1,2,3,{a:1}];JSON.st......
  • 数组元素排序(二)
    快速排序(QuickSort)由图灵奖获得者TonyHoare发明,被列为20世纪十大算法之一,是迄今为止所有内排序算法中速度最快的一种,快速排序的时间复杂度为O(nlog(n))。快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快......
  • json数据按照某一个相同键值进行分类成一个新的二维json数组
    1formatTreeData(checkNodes){2varmap={},3targetData=[];4checkNodes.forEach(item=>{5if(!map[item.groupKey]){6targetData.push({7value:item.groupKey,8label......