1. 题目

给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。

示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contiguous-sequence-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 动态规划

  • dp[i] 表示包含第i位数字的最大和
  • 如果dp[i-1] > 0,则dp[i] = dp[i-1] + nums[i]
class Solution {public:int maxSubArray(vector<int>& nums) {vector<int> dp(nums);for(int i = 1; i < nums.size(); ++i){if(dp[i-1] > 0)dp[i] = max(dp[i], nums[i]+dp[i-1]);}return *max_element(dp.begin(),dp.end());}
};
  • 当前状态只与前面一个状态有关,可以压缩
class Solution {public:int maxSubArray(vector<int>& nums) {int maxSum = nums[0], dp_i_1 = nums[0], dp_i;for(int i = 1; i < nums.size(); ++i){dp_i = max(nums[i], nums[i]+dp_i_1);maxSum = max(maxSum, dp_i);dp_i_1 = dp_i;}return maxSum;}
};

2. 分治

  • 类似归并排序的思想
class Solution {public:int maxSubArray(vector<int>& nums) {return divide(nums,0,nums.size()-1);}int divide(vector<int>& nums, int l, int r){if(l == r)return nums[l];int i, mid = l+((r-l)>>1);int Lsum = divide(nums,l,mid);//分治int Rsum = divide(nums,mid+1,r);//合并int Ls = 0, Rs = 0, maxL = INT_MIN, maxR = INT_MIN;for(i = mid; i >= 0; --i)//必须从中间开始遍历,便于求跨在两侧的最大和{Ls += nums[i];//左侧的和maxL = max(maxL, Ls);//最大的左侧和}for(i = mid+1; i <= r; ++i){Rs += nums[i];//右侧和maxR = max(maxR, Rs);//最大的右侧和}return max(maxL+maxR, max(Lsum,Rsum));//        最大的左+右和,最大的左侧和,最大的右侧和}
};

程序员面试金典 - 面试题 16.17. 连续数列(DP/分治)相关推荐

  1. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]

    [问题描述][简单] [解答思路] 边界问题 k=0 ,不能产生跳水板,返回空数组 shorter 等于longer,只有一种跳水板,返回longerk 思路 一般情况,k块木板,k种可能 跳水板的长 ...

  2. java兰顿蚂蚁解题思路_程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  3. 程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  4. 程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)

    1. 题目 请实现整数数字的乘法.减法和除法运算,运算结果均为整数数字, 程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算. 你的实现应该支持如下操作: Operati ...

  5. 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)

    文章目录 1. 题目 2. 解题 2.1 排序 2.2 不排序 1. 题目 给定一个整数数组,编写一个函数,找出索引 m 和 n ,只要将索引区间 [m,n] 的元素排好序,整个数组就是有序的. 注意 ...

  6. 程序员面试金典 - 面试题 16.20. T9键盘(数组)

    1. 题目 在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表. 每个数字映射到0至4个字母.给定一个数字序列,实现一个算法来返回匹配单词的列表. 你会得到一张含有有效单词的列表 ...

  7. 程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)

    1. 题目 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式. 例如,字符串"ca ...

  8. 程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

    1. 题目 给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]. 请找出一条直线,其通过的点的数目最多. 设穿过最多点的直线所穿过的全部点编号 ...

  9. 程序员面试金典 - 面试题 16.13. 平分正方形(数学)

    1. 题目 给定两个正方形及一个二维平面.请找出将这两个正方形分割成两半的一条直线. 假设正方形顶边和底边与 x 轴平行. 每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = ...

最新文章

  1. 什么是POM maven
  2. 存储过程系列之存储过程具体操作过程及sql数据库调用
  3. w550官方例程_急!求索爱w550的刷机所需要的所有文件! 全部分送上!
  4. python 第三方模块之 pandas 操作 excel
  5. android 页面整体滑动,ScrollView 实现页面整体滑动
  6. 2021级C语言大作业 - 涂鸦跳跃
  7. intel 酷睿core系列cpu的类型:U M H HQ MQ
  8. 01-HTML基础与进阶-day4-录像250
  9. C++基础:第八章 深入IO
  10. html javascript 表格id,javascript 获取表格中元素id的实现代码
  11. 基于Matlab的SLIC超像素分割算法分析
  12. 深度学习-模型预测(论文笔记)
  13. 英特尔第十代处理器为什么不支持win7_为什么i7处理器不支持win7系统,背后的真实原因?...
  14. 【产品经理】003-梁宁·产品思维30讲-机会判断(未完待续)
  15. Kali 工具系列【2】在kali linux 上抓取握手包
  16. 微信登陆之生成微信二维码
  17. Requirement already satisfied解决办法
  18. excel表格xlsx密码强制解除手机,忘记excel表格xlsx密码如何找回?
  19. canvas实现涂鸦效果--橡皮檫和历史记录
  20. 科学中有故事,故事中有科学

热门文章

  1. ios把数据传递到另一个页面_IOS 应用之间的跳转和数据传递详解
  2. 小程序 长按api_高质量的微信小程序样式模板应该长什么样?
  3. cocos2dx 圆盘抽奖_cocoscreator之微信小游戏的抽奖转盘
  4. 字符设备驱动高级篇4——设备类(自动创建和删除设备文件)相关代码分析
  5. nanotime java 博客园_System.nanoTime (计时工具类)
  6. SQL SERVER 查询表的行数
  7. 安装rlwrap 的简单方法
  8. 201521123061 《Java程序设计》第三周学习总结
  9. 5个经典的javascript面试问题
  10. SVN或其他网盘类软件同步图标不显示的异常