最大子数组问题/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.
问题分析(参考了算法导论第4章分治策略的内容):
为求一个含负数的一组数种,和为最大的子数组
这里使用分治的思想
首先,这一个子数组它只可能以3种方式存在:
完全在上半部分:low--mid
完全在下半部分:mid--high
或者跨越中点地存在:可理解为Arr[i..mid]+[mid+1..j]最大的元素和组成
算法的思想:递归地寻求左、右部分的最大子数组和
最后合并每次递归结果的解(只保留最后最大的结果)
时间复杂度分析:
n=1 T(1)=Θ(1)
n>1 子问题——求解左子数组和右子数组;每组子问题求解花费T(n/2)
所以算法的运行时间T(n)递归式为:
T(n)={ Θ(1) ,n=1
2T(n/2) ,n>1
最后可以求解出T(n)=Θ(nlgn)
#include<iostream>
#include<climits>
using namespace std;
const int infinite=-;
int Find_Max_Crossing_Subarray(int arr[],int low,int mid,int high)//扫描上半部分最大和、下半部分最大和,上下部分结合为跨越中点最大和
{ int left_sum=infinite;
int right_sum=infinite;
int max_left=-,max_right=-,sum=;
for(int i=mid; i>=low; i--)
{
sum+=arr[i];
if(sum>left_sum)
{
left_sum=sum;
max_left=i;
}
}
sum=;
for(int j=mid+; j<=high; j++)
{
sum+=arr[j];
if(sum>right_sum)
{
right_sum=sum;
max_right=j;
}
}
return (left_sum+right_sum);
}
int Find_Maximum_Subarray(int arr[],int low,int high)//
{
if(high==low)//只有一个元素的时候
return arr[low];
else
{
int mid=(low+high)/;
int leftSum=Find_Maximum_Subarray(arr,low,mid);
int rightSum=Find_Maximum_Subarray(arr,mid+,high);
int crossSum=Find_Max_Crossing_Subarray(arr,low,mid,high);
if(leftSum>=rightSum&&leftSum>=crossSum)
return leftSum;
else if(rightSum>=leftSum&&rightSum>=crossSum)
return rightSum;
else return crossSum;
}
}
int main()
{
int arr[]= {,,,-,,,,,-,};
int ans=Find_Maximum_Subarray(arr,,);
cout<<ans<<endl;
return ;
}
最大子数组问题/Maximum Subarray的更多相关文章
- LeetCode 53. 最大子序和(Maximum Subarray)
53. 最大子序和 53. Maximum Subarray 题目描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode53. M ...
- 【数组】Maximum Subarray
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...
- [Swift]LeetCode53. 最大子序和 | Maximum Subarray
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- 【数据结构】算法 Maximum Subarray
最大子数组:Maximum Subarray 参考来源:Maximum subarray problem Kadane算法扫描一次整个数列的所有数值,在每一个扫描点计算以该点数值为结束点的子数列的最大 ...
- 【LeetCode】53. Maximum Subarray 最大子序和 解题报告(Python & C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解法 动态规划 日期 题目地址: https:/ ...
- [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
随机推荐
- 02:PostgreSQL Character Sets
在利用postGIS导入shapefile文件到postgresql数据库的时候,老是提示字符串的问题,或者是乱码,试了好几种都不行,于是度娘之.... 使用默认的UTF8,提示信息是:建议使用LAT ...
- 深入浅出javascript(六)对象
2.为什么一切皆对象? <Javascript权威指南>解释了这个问题,问题的起源在于,如果typeof(字符串)返回的是string,并非object,那么为什么字符串也是对象呢? 简单 ...
- 7-18 Hashing - Hard Version
7-18 Hashing - Hard Version (30 分) Given a hash table of size N, we can define a hash function . Sup ...
- C(m,n)算法
排列组合:C(m,n),m为给定数列,n为要从数列m中取元素的数量,GetResult()获取所有不重复的组合. public class MathCombination<T> { Lis ...
- java基本语法、标识符、关键字
基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类名由若干单词组 ...
- 20155326《Java程序设计》实验一实验报告
实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版) ...
- bzoj 2440 完全平方数 【莫比乌斯函数】
题目 题意:第Ki 个不是完全平方数的正整数倍的数. 对于一个数t,t以内的数里的非完全平方数倍数的个数:num=1的倍数的数量−一个质数平方数(9,25,49...)的倍数的数量+两个质数的积平方数 ...
- CSS 基础 例子 Image 高度设置
body高度100%,三个image高度分别为auto,50%,60%,imge高度为当时body高度的百分比,auto时为原始高度 html代码如下: <!DOCTYPE html> & ...
- .NET MVC中如何使用手机验证码注册登陆
#region 手机验证码 /// <summary> /// /// </summary> /// <param name="Yonghushouji&quo ...
- 【算法python实现】 -- 最大子序和
原题:https://leetcode-cn.com/problems/maximum-subarray/ 问题描述: 输入:[-2, 1, -3, 4, -1, 2, 1, -5, 4], 输出:6 ...