Maximum Subarray 最大子数组和(连续)@LeetCode

python:实现max subarray sum最大子数组和算法(附完整源码) 阅读详情
package Level3;

import java.util.Arrays;

/**
 *
 * Maximum Subarray
 * 
 * Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

click to show more practice.

More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
 *
 */
public class S53 {

	public static void main(String[] args) {
		int[] A = {1,2,-1,-2,2,1,-2,1,4,-5,4};
		System.out.println(maxSubArray(A));
	}

	// 一维DP,可省略掉dp数组
	public static int maxSubArray(int[] A) {
        int max = A[0];
        int[] sum = new int[A.length];
        sum[0] = A[0];
        
        for(int i=1; i<A.length; i++){
        	// 要么不用前面的结果,要么用,求两者较大的
        	sum[i] = Math.max(A[i], sum[i-1]+A[i]);
        	max = Math.max(max, sum[i]);
        }
        
//        System.out.println(Arrays.toString(sum));
        return max;
    }

}



memory优化版,不用数组存了!

public class Solution {
    public int maxSubArray(int[] A) {
        int max = A[0];
        int maxEndHere = A[0];
        
        for(int i=1; i<A.length; i++){
            maxEndHere = Math.max(A[i], maxEndHere+A[i]);
        	max = Math.max(max, maxEndHere);
        }
        
        return max;
    }
}




Divide & Conquer

// http://www.geeksforgeeks.org/largest-sum-contiguous-subarray/
public class MaximumSubarray {

	public static void main(String[] args) {
//		int[] a = {-2,-3,4,-1,-2,1,5,-3};
//		int[] a = {-2,-3,-4,-1,-2,-1,-5,-3};
		int[] a = {-2, -5, 6, -2, -3, 1, 5, -6};
		System.out.println(maxSubArraySum2(a));
		System.out.println(maxSubArraySumDC(a, 0, a.length-1));
	}
	
	public static int maxSubArraySum(int[] a){
		int maxSoFar = 0, maxEndingHere = 0;
		int _maxStartIndexSoFar_ = -1;
		int _maxStartIndexEndingHere_ = -1;
		int _maxEndIndexSoFar_ = -1;
		
		for(int i=0; i<a.length; i++){
			if(maxEndingHere < 0){
				maxEndingHere = 0;
			}else{
				if(maxEndingHere == 0){
					_maxStartIndexEndingHere_ = i;
				}
				maxEndingHere += a[i];
			}
			if(maxEndingHere > maxSoFar){
				maxSoFar = maxEndingHere;
				_maxEndIndexSoFar_ = i;
				_maxStartIndexSoFar_ = _maxStartIndexEndingHere_;
			}
		}
		System.out.println("range: " + _maxStartIndexSoFar_ + " , " + _maxEndIndexSoFar_);
		return maxSoFar;
	}

	// Handling negative
	public static int maxSubArraySum2(int[] a){
		int maxSoFar = a[0], maxEndingHere = a[0];
		for(int i=1; i<a.length; i++){
			maxEndingHere= Math.max(a[i], maxEndingHere+a[i]);
			maxSoFar = Math.max(maxSoFar, maxEndingHere);
		}
		return maxSoFar;
	}
	
	
	// Divide and Conquerer O(nlogn)
	// http://www.geeksforgeeks.org/divide-and-conquer-maximum-sum-subarray/
	public static int maxSubArraySumDC(int[] a, int l, int h){
		if(l == h){
			return a[l];
		}
		
		// Find the mid point
		int m = (l+h)/2;
		return Math.max(Math.max(maxSubArraySumDC(a, l, m), 
											  maxSubArraySumDC(a, m+1, h)), 
											  maxCrossingSum(a, l, m, h));
	}

	private static int maxCrossingSum(int[] a, int l, int m, int h) {
		int sum = 0;
		int leftSum = Integer.MIN_VALUE;
		for(int i=m; i>=l; i--){
			sum += a[i];
			if(sum > leftSum){
				leftSum = sum;
			}
		}
		
		sum = 0;
		int rightSum = Integer.MIN_VALUE;
		for(int i=m+1; i<=h; i++){
			sum += a[i];
			if(sum > rightSum){
				rightSum = sum;
			}
		}
		
		return leftSum + rightSum;
	}
	
	
	// Leetcode when to buy stock
	
}


每个元素都可以选择用前面的curSum(如果是正数)或是不用(curSum为负)

public class Solution {
    public int maxSubArray(int[] A) {
        int len = A.length;
        if(len == 0){
            return 0;
        }
        int curSum = A[0];
        int maxSum = A[0];
        for(int i=1; i<len; i++){
            if(curSum < 0){
                curSum = A[i];
            }else{
                curSum += A[i];
            }
            maxSum = Math.max(maxSum, curSum);
        }
        return maxSum;
    }
}



max sub array tutorial maximum sub array tutorial slides 立即下载

相关推荐

VSCode里玩转AvaloniaUI:手把手教你搭建跨平台桌面应用开发环境(附.NET 7配置避坑)

本文详细介绍了如何在VSCode中搭建AvaloniaUI跨平台桌面应用开发环境,包括.NET 7配置避坑指南。从环境准备、项目创建到调试优化,手把手教你利用VSCode和Avalonia实现高效开发,特别解决了.NET 7依赖等常见问题,助力开发者快速上手跨平台应用开发。

weixin_28826545的博客 576

最大子序和(maxSubArray)

使用JavaScript,利用动态规划的方式求解最大子序和

u010206379的博客 310

卫星图像检测,分割,跟踪,超分辨率,数据集调研,以及论文笔记

目标检测,针对物体有很多类如桥,烟囱,罐子等,有静态图像下的检测,也就是图像源头多来自谷歌地图,但是前后帧没有任何联系,并且谷歌地图相对来说比较清楚,难度小一点,也有粗粒度以及较细粒度的检测,然后卫星视频的数据集较少,则可以通过前后帧的联系来辅助检测,并且卫星帧基本上只对车,船,飞机,火车进行检测,没有进行细粒度的检测即将车辆分类为卡车,皮卡,小轿车,但是关船,则可以分类为货船以及军舰,因为目前的卫星视频中小车实在太少了,难以进行更细粒度的检测。luojia 三号卫星。

zhangzhao147的博客 4706

[LeetCode]maxSubArray(最大子序列和!!!!)

经典dp问题 有两种问法, 1、如果最大子序列和是负数,则输出最大的负数 2、如果最大子序列和是负数,则输出0第一个和第二个问题其实可以统一,如果输出的最大数为负数,将其变成0即可。动态方程: 最大子序列和是连续的子序列 ThisSum[i]表示第i处,以A[i]结尾的子序列的最大和。 则状态方程为ThisSum[i]=max(ThisSum[i-1]+nums[i],nums[i])也

周大侠的专栏 4294

Vue3多级路由缓存失效的深度解析与实战解决方案

本文深度解析了Vue3项目中多级路由下keep-alive缓存失效的根本原因,并提供了三种实战解决方案:通过路由扁平化根治问题、利用状态管理精细模拟缓存效果,以及借助keep-alive-vue3插件快速修复。文章旨在帮助开发者彻底理解Vue Router与keep-alive的协作机制,从而根据项目情况选择最佳策略,有效解决页面状态丢失的难题。

weixin_29015801的博客 285

MATLAB配置MinGW编译器的完整指南

本文提供了在Windows系统上为MATLAB配置MinGW编译器的完整指南。详细介绍了通过MATLAB附加功能管理器在线安装和手动离线安装两种核心方法,并重点说明了如何解决常见的“未找到支持的编译器”等错误。指南包含从版本检查、环境变量配置到最终使用mex命令验证的每一步,帮助用户顺利完成MATLAB与MinGW的集成,以支持C/C++代码编译。

weixin_29031057的博客 264

最大子数组Max Subarray 最简单的实现方式--python

最大子数组 给定一个数组(可能包含负数),求连续的和最大的子数组 例: [-1, 0, 2, 3, -4, 8] 返回 9 因为0+2+3+(-4)+8=9 思路: 比较下标t时刻的值和t+ t-1 时刻的值, 如果t时刻大于 t-1 + t时刻的和, 则选择重新开始计算, 否则就继承前边的值 0时刻: -1 1时刻: 比较1时刻(0)和 0时刻+ 1时刻: (-1), 大于, 重新开始计算,当前值为0 2时刻: 比较(2) 和t + t-1 : (0+2 ), 不大于, 继承 3时刻: 比较(3)

kasiko的博客 684

Vector CANape的使用记录

开门见山,今天想和大家分享下CANape使用记录,分享原因是近日在分析一个客户现场软件问题时,需要用到CANape来实时的监测ECU中的变量,因为之前对CANape的认知比较浅薄,觉得标定工程师使用他就足够了,但是这次的经历让我觉得需要写点东西来记录自己学习并使用他的过程。 相信大家能够在网上找到很多关于如何使用CANape的文章,从新建Project到后面的数据的观测、保存以及回放等等。我个人也是这么学过来的,所以我不打算从那些方面着手去描述如何使用她,而是根据我的真实使用过程以及问题的抛出到如何解决来

2万+

最大字段和问题(maxSubArray)

LeetCode: 54 (动态规划) 问题描述: 给定由 n 个整数组成的序列 a1 , a2, …… , an ,求该序列字段和的最大值,当所以整数均为负值时定义其最大字段和为 0。数学描述为: MAX_SUBSTRING= MAX{0 ,max1<=i<=j<=nk=ija[k]} 例子:给定{-2,11,-4,13,-5,-2}, 最大...

qq_39816087的博客 1184

昇腾CANN实战:如何用DVPP+AIPP实现32路视频流毫秒级预处理(附性能对比)

本文深入探讨了昇腾CANN架构中DVPP和AIPP模块在32路视频流毫秒级预处理中的硬件加速技术。通过异构计算架构的优化,实现了从传统CPU方案的40.7毫秒到CANN方案3.4毫秒的显著性能提升,特别适用于智能安防领域的实时视频分析需求。文章详细解析了DVPP多通道并行设计和AIPP模型级预处理融合的技术细节,并提供了性能对比数据与实战调优经验。

alice7model的博客 918

C# OpenCvSharp4实战:5分钟搞定工业视觉模板匹配(附完整代码)

本文为C#开发者提供了基于OpenCvSharp4的工业视觉模板匹配实战指南。通过详细的环境搭建、核心原理解析和完整代码示例,重点介绍了如何使用`matchTemplate`函数,特别是`CCoeffNormed`方法,快速实现高精度、抗光照变化的模板匹配,并分享了多目标匹配、图像预处理等工业级优化技巧。

weixin_29053067的博客 501

LeetCode:maxSubArray

给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 第一个想到的思路就是暴力求解,但是自己写的暴力求解也没有测试成功,因为花费的时间复杂度为0(n*n),参考了一下别人的暴力求解方案,时间复杂度为0(n): ...

remanented的博客 472

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Max Subarray思路解析及源代码

if(nums.length==0) return 0; int max=Integer.MIN_VALUE; int maxnow=max; for(int i=0;i<nums.length;i++){ maxnow=nums[i]; for(int j=i+1;j<nums.length;j++){ if(maxnow<maxnow+nums

yinyanting1的博客 729

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LeetCode 一题多解 | 53. 最大子数组和:五种解法完全手册

作者:nettee 公众号:面向大象编程一、原题描述 LeetCode 53. Maximum Subarray 最大子序和二、全部解法 本文将介绍「最大子数组和」...

nettee的专栏 1509

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

0053_Maximum-Subarray【M】(求和最大的连续子数组)

JY:和最大的连续子数组

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 1012

算法设计与分析 复习总结

复习用:算法设计与分析_北航_中国大学MOOC

qq_50918834的博客 709

Maximum subarray sum(求最大的子数组求和)

例如maxSequence([-2, 1, -3, 4, -1, 2, 1, -5, 4]) # should be 6: [4, -1, 2, 1]按照一般思想,代码如下def maxSequence(arr): max=0 for i in range(len(arr)): for n in range(i+1,len(arr)+1): ...

Keyu 1379

[算法分析与设计] leetcode 每周一题: 053. Maximum Subarray

题目链接:  53. Maximum Subarray 题目大意: 给定整型数组 A, 找出 A 的(连续)子数组的和的最大值 ; 例如: 给定数组 [-2,1,-3,4,-1,2,1,-5,4], 则输出应为: 6 ; ( 对应子数组 [4,-1,2,1] ) 解题过程: (注: 因为这种类型的题目以前不知道什么时候做过, 所以以下尽量回忆一下当时的思

sinat_37893507的博客 258

LeetCode53. Maximum Subarray (子数组的最大和) 解题思路方法

最大连续子序列和,非常经典的题。 当我们从头到尾遍历这个数组的时候,对于数组里的一个整数,它有几种选择呢?它只有两种选择: 1、加入之前的SubArray;2. 自己另起一个SubArray。那什么时候会出现这两种情况呢? 如果之前SubArray的总体和大于0的话,我们认为其对后续结果是有贡献的。这种情况下我们选择加入之前的SubArray 如果之前SubArray的总体和为0

sinat_24048051的博客 395

LeetCode---Maximum Subarray

LeetCode---Maximum Subarray

James Zhang's Blog 1229

分治策略 - 最大子序列和问题

  最大子序列和问题的描述:从一组数中找出下标连续的几个数,这几个数组成的数组的和是所有情况中值最大数组。比如:{13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7},这么一组数中最大的为:{18, 20, -7, 12},这组数的和是最大的:43。如果想要把所有子数组都列出来找的话,子数组共有A(n,2)种...

ding7530的博客 480

最大子数组之和

一、最大和小于0时,和为0 int maxSubArraySum(int a[], int size) { int max_so_far = 0, max_ending_here = 0; int i; for(i = 0; i < size; i++) { max_ending_here = max_ending_here + a[i];

stay hungry,stay foolish 729

53. Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

Maggie_2015的博客 181

最大连续子数组和

题目描述 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值,要求时间复杂度为O(n)。 例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5 ,和最大的子数组为 3, 10, -4, 7, 2 , 因此输出为该子数组的和18。 #include using name

一米阳光 755

卡丹尔算法(max subarray problem)

问题介绍 Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one and sell one share of th

huizhang0110 1811
上一篇: Binary Tree Preorder Traversal 二叉树的先序@LeetCode
下一篇: Unique Paths 求在矩阵里从左上走到右下的总方法数@LeetCode
chiiis
博客等级 码龄14年 422粉丝 429原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值