求最大子数组和

  • 题目
  • 纠错1:
  • 修改1:
  • 动态规划1:
  • 动态规划的进一步优化:
  • 贪心法1:

题目

给你一个整数数组 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

来源:力扣(LeetCode)

纠错1:

第一个方法暴力解,提交以后时间复杂度超时了。。。
此外,在边界数组中的检验修改了好多次,比如[-1,2],[-1,-2],[-1]
本人吸取总结教训和经验:

  • 检验时考虑边界的特殊情况,比如数组里只有一个或两个元素,全为负数等
  • 对于求和类。int sum = 0 有负数风险,不如一开始初始化为nums[0];或者单独定义一个result变量去返回值
  • 对于for循环不清楚边界的问题,在旁边备注一个例子测试一下可取边界
  • 写函数时不要忘了写返回值。。。
  • for循环嵌套要厘清逻辑,尽量最多两层嵌套
class Solution {public:int maxSubArray(vector<int>& nums) {int n=nums.size();//2int sum=nums[0];if (n==1)return nums[0];for (int i=0; i<n; i++)//0-1{for (int j=n-1; j>0; j--)//1{//long int subsum=std::accumulate(nums.begin()+i,nums.end()-j,0);int subsum=0;for (int m=i,n=j;m<=n;m++)//{subsum+=nums[m];if ( sum < subsum )sum = subsum;};};};return sum;};
};

修改1:

超出时限- -考虑其他思路

class Solution {public:int maxSubArray(vector<int>& nums) {int numsSize=int(nums.size());int result = INT_MIN;//#includ<limits>for (int i=0; i<numsSize; i++){int sum = 0;for (int j=i; j<numsSize; j++){sum+=nums[j];if (result < sum)result = sum;};};return result;};
};

动态规划1:

需要注意的地方:

  • for循环的每条语句厘清逻辑,目的是什么,得到的值是什么
  • 返回变量的初始值设定问题,个人感觉还是设为数组[0]比较好,避免了数组只有一个元素的情况,逻辑上也不太容易出现漏洞
  • 变量命名上,注意一下如,maxSubArray
  • 用到一些库函数,如max
class Solution {public:int maxSubArray(vector<int>& nums) {int numsSize=int(nums.size());//int result = INT_MIN;//声明成理论意义上的极值避免在if判断比较中出现逻辑漏洞int result = nums[0];//vector<int> maxSumArray(numsSize);//vector动态内存管理,这里仿佛不必要int maxSumArray[numsSize];//简单的累加,已知空间大小//maxSumArray.pushback(nums[0]) ;maxSumArray[0] = nums[0];for (int i=1; i<numsSize; i++){maxSumArray[i]=max(maxSumArray[i-1]+nums[i], nums[i]);//#include<algorithm>,容易漏掉只有nums只有一个值的情况result= max(maxSumArray[i],result);};return result;};
};

动态规划的进一步优化:

class Solution
{public:int maxSubArray(vector<int> &nums){int numsSize = int(nums.size());//因为只需要知道dp的前一项,我们用int代替一维数组int dp(nums[0]);int result = dp;for (int i = 1; i < numsSize; i++){dp = max(dp + nums[i], nums[i]);result = max(result, dp);}return result;}
};

更进一步的简化:

cppclass Solution
{public:int maxSubArray(vector<int> &nums){int n(nums.size());int sum2(nums[0]);int result = sum2;for (int i=1; i<n; i++){/* 不如直接使用max函数效率高int sumTemp(sum2+nums[i]); if (sumTemp < nums[i])sum2 = nums[i]; elsesum2 = sumTemp;*/sum2 = max(sum2+nums[i], nums[i]);//result = max(sum2, result);不如直接判断效率高:if (result < sum2)result = sum2;}return result;}
};

贪心法1:

注意点:

  • 初始值的设定一直是个问题,设定不好很容易在边界问题上出错,比如只有一个或两个元素的数组。这里的sum2设初值为0,因为在for循环中,sum2一开始就是从nums[0]开始累加的。而result是在后续的max中比较得到,这里的比较元素就是sum2和自身,因此自身的初始化也得有含义,这里要么是理论意义上的最小值,要么是初值。
  • 再说一下贪心的思想,贪心就是sum2 本来是 不断累加,然后每一次累加都与上一次的result比较得出新的result。在逻辑上,sum2累加后要是小于零的话还不如直接用下一个值(也就是0加下一个nums[i]),所以这里贪心的核心思想就是:sum2小于零时归零(result保留着清零前各步中保留的最大值)
class Solution
{public:int maxSubArray(vector<int> &nums){int n(nums.size());int sum2(0);int result(nums[0]);for (int i=0; i<n; i++){sum2+= nums[i];result=max(sum2,result);if (sum2<0)sum2=0;}return result;}
};

求最大子数组和(数据结构和算法C++)相关推荐

  1. 结对开发——环形一维数组求最大子数组和

    题目:返回一个整数数组中最大子数组的和. 要求: (1)输入一个整形数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)如果数组A[0]--A[ ...

  2. 结对开发 随机产生数组并求最大子数组的和

    一.题目 返回一个整数数组中最大子数组的和. 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O( ...

  3. 环形数组求最大子数组之和

    环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一 ...

  4. 数组【数据结构与算法Java】

    数组[数据结构与算法Java] 数组 数组 略

  5. 求最大子数组(贪心算法)

    在<算法导论>中举了买股票和割铁棒的例子来说明动态规划和贪心算法的主体思想. 贪心算法:总是做出在当前看来最好的情况.(不是整体最优的) 1. 问题及答案 先抛出一个问题,类似于<算 ...

  6. java求最大子数组 (分治算法)

    当一个数组有负数时,最大子数组才会有意义. package shu.quan.demo;/*** 求最大子串的值,并求出脚标.*/ public class MaxSubsequence {stati ...

  7. 最大子数组下标java,【算法】最大子数组

    问题描述:给定一只股票在某段时间内的历史价格变化曲线,找出一个能够实现收益最大化的时间段. 理解:为找出最大化的收益,需要考虑的是在买进和卖出时的价格变化幅度,因此从该股票的每日变化幅度来考虑问题比较 ...

  8. LeetCode 53. 最大子数组和【贪心算法、动态规划】

    53. 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 子数组 是数组中的一个连续部分. 示例 1: 输入:nums = [- ...

  9. arrays中copyof复制两个数组_数据结构与算法(3)数组

    前言 数组(Array)是一种线性表数据结构,利用一组连续的内存空间,存储一组具有相同类型的数据. 概念介绍 首先我们说一下什么是线性表,线性表就是数据排成一条线的数据结构,每个线性表最多只有前和后两 ...

最新文章

  1. 结对开发----找一
  2. AutoHotkey 使用笔记
  3. 为eclipse在线安装svn
  4. 关于Oracle回收站的一些操作
  5. 简单说明c语言程序步骤,C语言的入门简介和三个简单的C语言程序详细说明
  6. LeetCode 161. 相隔为 1 的编辑距离(DP/遍历)
  7. python机器学习常用包下载安装以及使用案例汇总
  8. js基础之--变量 作用域和内存问题
  9. EnterCriticalSection 多线程操作相同数据遇到的问题(线程锁)
  10. 前端H5如何实现分享截图
  11. mui 点击长按复制文本
  12. oracle优化方法,九大Oracle性能优化基本方法详解
  13. 渗透测试必备前置知识
  14. 【微信小程序】图库——(小程序篇)
  15. 经常听别人说安全测试很重要,然鹅你并不了解?一文带你了解全貌
  16. BT05蓝牙模块使用教程
  17. Luts预设 解密档案尘封历史风格化电影调色滤镜
  18. 大西洋月刊 2019年7月_Web开发人员月刊2018年10月
  19. python正则表达式大全(常用数字、字符、常用的需求包括手机号、邮箱、电话号码、身份证号等)
  20. 纸上得来终觉浅,可以这里看一眼---->栈和队列(下)

热门文章

  1. 打印机维修不求人,五种简单的维修法
  2. VIP年卡低至7折,限时加赠618次下载,我不允许任何人不心动!
  3. ElementUI Tab 右边加按钮
  4. 怦然心栋-冲刺日志(第1天)
  5. 手机刷机方法,你刷机了吗
  6. 亿级流量架构:服务器扩容思路及问题分析
  7. matlab表示520函数,MatLab中ln函数怎么表示呢
  8. 对现在中国股市的精辟分析
  9. 机器学习实践系列之7 - 车辆检测
  10. 关于Visitor模式