求给定数组的最大子数组

给定一个数组,求数组的最大连续子数组,使得该子数组的和最大 最大连续子数组 给定一个数组,求数组的最大连续子数组,使得该子数组的和最大 解释 因为昨天的算法题还有别方法没写,直接复制昨天的内容,在此基础进行跟进 暴力法 直接先上代码 function maxSubarray(arr) { let maxSum = arr[0] let startIndex = 0 let endIndex = 0 for (let i ... 阅读详情

话说前天晚上被网易虐的也是够惨,3道编程题做出来两道,一个运行超时,一个通过率为70%。其实考的是动态规划之类的东西,只可惜我当时没有好好学。虽然牛客网服务器挂了导致考试延长一个小时,但这对我并没有什么实质帮助,不会还是不会呀。
今天开始啃《算法导论》,每天一个算法,坚持!
简单看了下分治这一节,照着书上的思想敲出了”给定数组的最大子数组”的代码,如下:

int FindMidMaxSum(const vector<int>& v, int left, int mid, int right, int* MaxLeft, int* MaxRight)
{
    if (left > mid || mid > right)
        return 0;
    int LeftSum = 0;
    int RightSum = 0;
    int LeftMaxSum = INT_MIN;
    int RightMaxSum = INT_MIN;
    int i;
    for (i = mid;i >= left;--i)
    {
        LeftSum += v[i];
        if (LeftSum > LeftMaxSum)
        {
            LeftMaxSum = LeftSum;
            *MaxLeft = i;
        }
    }
    for (i = mid + 1;i <= right;++i)
    {
        RightSum+= v[i];
        if (RightSum > RightMaxSum)
        {
            RightMaxSum = RightSum;
            *MaxRight = i;
        }
    }
    return LeftMaxSum + RightMaxSum;
}

int FindMaxSubArray(const vector<int>& v, int left, int right,int* i,int* j)
{
    if (left > right)
        return 0;
    if (left == right)
    {
        *i = *j = left;
        return v[left];
    }
    int MaxLeft1, MaxRight1,MaxLeft2, MaxRight2,MaxLeft3, MaxRight3;
    int mid = left + (right - left) / 2;
    int LeftSum = FindMaxSubArray(v, left, mid, &MaxLeft1, &MaxRight1);
    int RightSum = FindMaxSubArray(v, mid + 1, right, &MaxLeft2, &MaxRight2);
    int MidSum = FindMidMaxSum(v, left, mid, right, &MaxLeft3, &MaxRight3);
    if (LeftSum >= RightSum && LeftSum >= MidSum)
    {
        *i = MaxLeft1;
        *j = MaxRight1;
        return LeftSum;
    }
    else if (RightSum >= LeftSum && RightSum >= MidSum)
    {
        *i = MaxLeft2;
        *j = MaxRight2;
        return RightSum;
    }
    else
    {
        *i = MaxLeft3;
        *j = MaxRight3;
        return MidSum;
    }
}

int calculateMax(vector<int> prices) 
{
    int i;
    vector<int> v;
    int left, right;
    for (i = 1;i < prices.size();++i)
    {
        v.push_back(prices[i] - prices[i - 1]);
        cout << prices[i] - prices[i - 1]<<" ";
    }
    cout << endl;
    int sum1=FindMaxSubArray(v, 0, v.size() - 1, &left, &right);
    int a = left;
    int b = right;
    int sum2 = FindMaxSubArray(v, 0, left - 1, &left, &right);
    left = a;
    right = b;
    int sum3 = FindMaxSubArray(v, right, v.size()-1, &left, &right);
    if (sum1 <= sum2 && sum1 <= sum3)
    {
        if (sum2 < 0)
            return sum3;
        if (sum3 < 0)
            return sum2;
        return sum2 + sum3;
    }
    else if (sum2 <= sum1 && sum2 <= sum3)
    {
        if (sum1 < 0)
            return sum3;
        if (sum3 < 0)
            return sum1;
        return sum1 + sum3;
    }
    else
    {
        if (sum1 < 0)
            return sum2;
        if (sum2 < 0)
            return sum1;
        return sum1 + sum2;
    }
}

代码的github地址

本文首发于www.sbrave.cn

【完】

【Python】给定一个数组A[0,…,n-1],求A的连续子数组,使得该子数组的和最大 最大子数组 给定一个数组A[0,…,n-1],求A的连续子数组,使得该子数组的和最大。 例如数组: 1, -2, 3, 10, -4, 7, 2, -5 最大子数组:3, 10, -4, 7, 2 算法分析 定义:前缀和sum[i] = a[0] + a[1] + …+a[i] 则:a[i,j]=sum[j]-sum[i-1](定义sum[-1] = 0) 算法过程 ... 阅读详情

相关推荐

一个数组子数组的最大和

求一个数组子数组的最大和,这是一道非常经典的公司面试或笔试题目,我分别使用了暴力枚举、分枝界定、动态规划三种算法实现。

最大子数组

题目描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。 样例:给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 如果数组全是正数,那么最大子数组当然就是整个数组了。正因为穿插了负数,才让这道题有点难度。 所以,思路是这样的: 1. 依次求取前n位的和, 那么,当然有两种情况:和为正;和为负 2. 如果和为

guoziqing506的博客 1666

数组中最大和的子数组

求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)

求最大子数组的三种方法

(1)暴力求解,运行时间是n²        int ans = -1000000;          for(int i=0; i&lt;n; i++)          {              int sum = 0;              for(int j=i; j&lt;n; j++)              {                  sum += nums[j]...

wangsiman的专栏 1万+

aarch64环境安装minio

1.去官网查看最新版本2.使用命令安装,采取wget和dnf安装wgetminio.rpmdnfdnfdnfdnf。

Myuanforever的博客 2180

新华硕笔记本ubuntu18.04双系统安装之后,wifi没有显示无法链接wifi

本来我以为跟简单安装一个wifi网卡的驱动就可以解决的问题,没想到花了我一早上的时候解决… 惭愧。 另外,本来是没打算写这篇博客的,但是我在搜索解决这个问题的过程中, 发现多人提出的解决方案跟我的都不一样,甚至我的解决方案都没有搜到相应的答案,还是只能靠自己啊。。 言归正传,还是说说怎么正确的安装wifi驱动吧! 1. wifi没有正确安装、或没有正确配置的表现 我的电脑现象: 有wifi图标, wifi设置上显示unaviable,无法搜索到任何wifi; 还有其他类似的表现,大家可以看看其他朋友的提

Ian的博客 1889

算法-leetcode-每日一题-求最大子数组

分析:该题是一道经典的题,但是很多人理解不了,我在此处进行了总结,大家按我的思路看下去,肯定能理解。 使用蛮力法。最外循环为第i个数,第二循环从i开始一直到数组尾j,最内循环则计算i到j子数组的和。 public static int maxSubArray(int arr[]) { int n = arr.length; int ThisSum = 0, MaxSum = 0...

wujingchangye的博客 771

手把手保姆级|Python爬取微信公众号文章完整版,反反爬策略拉满,附可运行完整代码(永久可用)

做Python爬虫的朋友都知道,爬取微信公众号文章 绝对是爬虫领域的「香饽饽」也是「硬骨头」。一方面,微信公众号的文章是极具价值的数据源:不管是自媒体从业者做竞品分析、新媒体运营者整理干货、还是个人学习收集资料,都需要批量爬取公众号文章;另一方面,微信的反爬机制堪称全网最严苛之一 ——腾讯对微信生态的风控做到了极致,动态渲染页面、高频IP封禁、Cookie短时效失效、请求头严格校验、自动化工具秒识别、频繁请求直接拉黑,这些反爬手段让90%的爬虫新手望而却步:要么爬了几篇就被封IP,要么Cookie失效爬取中

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2626

给定数组求数组中和最大子数组的和

//20173626 郑锦package 数组求和; import java.util.Scanner; public class shuzu { public static void main(String[] args) { //定义一个数组 int s[]=new int...

weixin_30294709的博客 188

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

weixin_42412049的博客 1015

Thor芯片部署

英伟达Jetson Thor芯片性能分析与应用现状 摘要:英伟达最新发布的Jetson Thor芯片基于Blackwell架构,官方宣称AI算力达2070TFLOPS(FP4),较前代Orin提升7.5倍,配备14核Arm CPU和128GB内存。然而实际量产版算力缩水至700TOPS,且因4nm制程良率问题多次延期至2025-2026年交付。该芯片支持FP4/FP8量化、Transformer引擎等先进特性,适用于自动驾驶、机器人等边缘AI场景,但受供应链限制,国内厂商倾向自研方案。开发者可通过JetPa

xiaomu_347的博客 431

python求连续子数组的最大值_求给定大小的每个连续子数组的最大值

我试图用Python解决以下问题Given an array and an integer k, find the maximum for each and every contiguous subarray of size k.这个想法是使用一个双端队列。这是我的代码:def diff_sliding_window(arr, win):# max = -infQ = []win_maxe...

weixin_39880899的博客 156

cartographer实现纯定位

实现纯定位 (1)因为正常的cartographer的建图的map是由cartographer发布的;如下 rostopic info /map Type: nav_msgs/OccupancyGrid Publishers: * /cartographer_occupancy_grid_node 因此需要把map的发布替换成 <node name="map_server" pkg="map_server" type="map_server" args="/home/lx.

Studying…… 5888

给定数组,求最大的非邻接子数组之和

 给定数组,求最大的非邻接子数组之和,复杂度o(n)例如: i) 3 2 7 10 结果是 13 ( 3 and 10) ii) 3 2 5 10 7 结果是 15 (sum of 3, 5 and 7) 对数组 a[i], i = 1, 2, 3, ..., N , 结果是 f[N] f[1] = a[1] f[2] = max (a[1], a[2]) f[n 

消逝的地平线 807

极验点选click3.1.0所对应fullpage.js的逆向分析

极验3代点选验证,本文适用于使用click.3.1.0.js和fullpage919-eyz9lh.js版本的web验证码,没有细节内容,适合有基础的开发者阅读。

shanf7921的博客 648

Pydoll浏览器自动化框架教程

让浏览器自动化回归本质。不再纠缠驱动兼容、不再手动处理验证码、不再因为请求和 UI 分裂而头疼。如果你经常做 Web 自动化、爬虫或者测试,不妨试试 Pydoll。也别忘了给项目点个 ⭐,让作者知道有人喜欢这个工具。👉GitHub 地址。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 204

【剑指offer】求给定数组的具有最大和的连续子数组

题目: 给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 class Solution { public: int FindGreatestSumOfSubArray(vector<int> &nums) { int n = nums.size(); ...

Arlingtonroad的博客 289

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

求每个元素之和为最大的给定数组的子数组

给定的数组,元素可能为正或者为负 方法 1. broute-force 这个是最容易想到的方法,就是把每个可能的子数组列出来,计算出元素之和,然后把最大的挑出来。显然,这个算法的时间复杂度为 O(n^2) struct tuple FindMaxSubArray(int *array, int size) { struct tuple t; t.sum = INT_MIN;

小猪爱拱地 824

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

一个数组的异或和是指数组中所有的数异或在一起的结果,给定一个数组arr,求最大子数组异或和。

一个数组的异或和是指数组中所有的数异或在一起的结果,给定一个数组arr,求最大子数组异或和。

z1171127310的博客 2806

给定正数数组arr,求任意子数组最小值与子数组累加和的乘积最大值是多少

1)单调栈的敏感度:求滑动窗口内的最大值,最小值,或者,求i左边右边距离i最近比i小的位置L,R 2)前缀累加和数组pre的敏感度,要随时可以想到,尤其是arr大于0时,这个可以加速算法。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 563

给定数组arr和k,求3个不重叠的长为k的子数组的累加和之和最大值是多少?

1)熟悉2大数组累加和的基础,对于理解和解决本题,至关重要 2)用预设前缀累加和数组,可以快速拿到L--R内的累加和 3)准备好0--i范围内任意长度为k的子数组的最大累加和数组; 4)准备好i--N-1范围内任意长度为k的子数组最大累加和数组;

weixin_46838716的博客 452

【java】给定一个长度是m的整型数组, 求 这个数组的k个数的子数组的最大平均值 和k的值

【java】给定一个长度是m的整型数组, 求 这个数组的k个数的子数组的最大平均值 和k的值。问题描述: 给定一个数组,求求 这个数组的k个数的子数组的最大平均值 和k的值 问题分析: 子数组是连续的,比如数组是{1,2,7,7,7} 连续的3 个777,则k值是 3 ;but 数组是{1,2,7,7,7,8}时,最大平均值是8,k值是1

dw的博客 307

最大子数组问题(分治法)

问题描述:对给定数组A,寻找A的和最大的非空连续子数组。 输入格式:输入的第一行包括一个整数n,代表数组中的元素个数,接下来的一行包含n个整数(可以包含负数),以空格分隔。 输出格式:一个整数,表示最大的连续子数组的和。 样例输入: 9 2 4 -7 5 2 -1 2 -4 3 样例输出: 8 解题思路:使用分治法 分:将数组分成两半,直到只有一个元素 治...

weixin_41423494的博客 7870

给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字), 使得这个“子数组”的和是所有“子数组”和中最大的...

package test; import java.util.Arrays; /** * 给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字), * 使得这个“子数组”的和是所有“子数组”和中最大的; * 如给定的数组为{12,-8, 5, 66, -21, 0 ,35, -44,7}, * 则最大的和的子数组为{12, -8, 5, 66, -21,...

weixin_30659829的博客 264

leetcode 918.环形子数组的最大和

题意: 给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和。子数组要连续!important; 题解: 因为是环形,所以我们可以分为两种情况讨论 包含两段 只包含一段 对于第一种情况,先求出数组的和,然后再再求出和最小的子数组,用和减去它即可 对于第二种情况,我们直接求出和最大的子数组 然后二者取最大值即可。 和最小的子数组 && 和最大的子数组 dp[i]=max(dp[i−1]+a[i],a[i])dp[i] = max(dp[i-1]+a[i], a[i]

我是蒋卫升呀~ 262
上一篇: KMP算法
下一篇: 选择排序
SmartBrave
博客等级 码龄12年 25粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值