【问题描述】[第53题][最大子序和][中等]

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

【解答思路】

1. 动态规划

思路1
第 1 步:设计状态
int[] temp = new int[len]; 记录前i个和
第 2 步:状态转移方程
前一个i-1+nums[i] 和 nums[i] 作比较
temp[i] = Math.max(temp[i-1]+nums[i],nums[i]);
第 3 步:考虑初始化
temp[0] = nums[0]; max= nums[0];
第 4 步:考虑输出

时间复杂度:O(N) 空间复杂度:O(N)

public int maxSubArray(int[] nums) {if (nums.length == 0)return 0;int[] dp = new int[nums.length];dp[0] = nums[0];int max = dp[0];for (int i=1; i<nums.length; i++){dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);max= Math.max(dp[i],max);}return max;}
2. 贪心算法

时间复杂度:O(N) 空间复杂度:O(1)

  • sum就是这个“i之前最大子数组的和”
  • 如果它大于0,则加上num就是“i+1之前最大子数组的和”
  • 如果它小于0,则num本身就是“i+1之前最大子数组的和”
class Solution {public int maxSubArray(int[] nums) {int ans = nums[0];int sum = 0;for(int num: nums) {if(sum > 0) {sum += num;} else {sum = num;}ans = Math.max(ans, sum);}return ans;}
}
3. 分治算法(可忽略)
  1. 将数组分成左半部分、右半部分和中间包括左右边界的三种区间遍历。
  2. 得到三个区间的最大连续子数组和就是原数组的最大连续子数组和。
  • 本题使用分治不是很理智,copy 大神的方法。
public class Solution {public int maxSubArray(int[] nums) {int len = nums.length;return maxSubArray(nums, 0, len - 1);}private int maxSubArray(int[] nums, int left, int right) {// 只有一个数则直接返回。if (left == right) {return nums[left];}// 找到区间的中间位置。int mid = left + (right - left) / 2;// 返回中间位置左边、右边以及包含中间位置三种情况的能达到的最大子数组和。return Math.max(maxSubArray(nums, left, mid), Math.max(maxSubArray(nums, mid + 1, right), maxCrossingSum(nums, left, mid, right)));}private int maxCrossingSum(int[] nums, int left, int mid, int right) {int sum = 0;// 左边加到 mid 位置能达到的最大和。int leftSum = Integer.MIN_VALUE;// 计算以 mid 结尾的最大的子数组和。for (int i = mid; i >= left; i--) {sum += nums[i];if (sum > leftSum) {leftSum = sum;}}sum = 0;// 右边以 mid 位置开始加能达到的最大和。int rightSum = Integer.MIN_VALUE;// 计算以 mid + 1 开始的最大的子数组和。for (int i = mid + 1; i <= right; i++) {sum += nums[i];if (sum > rightSum) {rightSum = sum;}}// 返回包含 mid 和 mid + 1 两位置数的最大子数组和。return leftSum + rightSum;}
}

【总结】

1.Java中 Math.max 优化if-else 结构
2. 动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

3. 数组初始化
  • 一维数组

1.在定义时初始化。

 int[] arrays = {1, 2, 3, 4, 5};                    //简化int[] arrays = new int[]{1, 2, 3, 4, 5};      //完整格式 推荐

2.先定空间,随后赋值。

- int []age = new int[10];//动态初始化for (int i = 0; i < age.length; i++) {age[i] = i;}
  • 二维数组

1.在定义时初始化。

double[][] a = new double[][] {{1,2,3},{4,2,7}};
double[][] b = new double[][] {{3,3},{1,1},{2,2}};

2.先定空间,随后赋值。

double [][] container = new double[3][4];
for(int i = 0; i < 3;i++) {for(int j = 0; j < 4;j++) {container[i][j] = 4.5;}
}

参考链接:https://leetcode-cn.com/problems/maximum-subarray/solution/53ti-zui-da-zi-xu-he-by-iceblood/
参考链接:https://leetcode-cn.com/problems/maximum-subarray/solution/hua-jie-suan-fa-53-zui-da-zi-xu-he-by-guanpengchn/

[剑指offer]面试题第[42]题[Leedcode][JAVA][第53题][最大子序和][动态规划][贪心][分治]相关推荐

  1. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 1 package com.xsf.Sor ...

  2. 剑指offer面试题34. 二叉树中和为某一值的路径(先序遍历)(回溯)

    题目描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 思路 详见链接 代码 class Solution:def ...

  3. [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

    [问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...

  4. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

    [剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...

  5. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  6. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  7. (待补充)【n个骰子的点数】剑指offer——面试题43:n个骰子的点数

    剑指offer--面试题43:n个骰子的点数 [注意]此题再牛客网上没有OnlineJudge,在此补充解法. 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值 ...

  8. (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数

    剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...

  9. 【有返回值的回溯】剑指offer——面试题67——机器人的运动范围(回溯法)

    剑指offer--面试题67:机器人的运动范围(回溯法) Solution1: 此题和66题均是典型的回溯法题目,对比记忆思路! class Solution {public:int movingCo ...

最新文章

  1. ORB-SLAM2系统的实时点云地图构建
  2. 配置BIND 9 DNS Views 的原理和需求
  3. HTML5 script元素async,defer异步加载
  4. 【2016 Asia China-Final D题】
  5. yy自动语音接待机器人_人脸签到、发言记录,会议机器人来啦
  6. php post json请求参数传递_php post json参数的传递和接收处理方法
  7. Python 报错TypeError: expected string or bytes-like object
  8. 虚拟机连接iso后挂载
  9. Apple 官方文档翻译:NSURLSession
  10. 中文文本拼写检查错误纠正方案整理
  11. 飞机大战(源码+素材)
  12. win10下微软office2010卸载
  13. 记录自己关于Linux的学习和RHCSA、RHCE认证相关
  14. 计算机exo乐谱,【图片】【送谱】EXO所有歌曲的谱子【吉他谱吧】_百度贴吧
  15. 什么是敏捷管理 常用的敏捷Scrum会议有哪些
  16. element 配置全局样式 例如:为项目中所有el-dialog弹窗添加分割线
  17. 端口映射、SNAT(源网络地址转换)
  18. 沉睡者IT - 什么是Web3.0?
  19. springboot+openCV项目:使用和linux部署
  20. 防御性编程(Defensive Programming)

热门文章

  1. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
  2. MySql 缓存查询原理与缓存监控 和 索引监控
  3. SCOPE_IDENTITY和@@identity的区别
  4. mysql sum_MySQL中的SUM函数使用教程
  5. javaScript数据类型(包括基本数据类型和非基本数据类型)
  6. either fix the issues identified by lint, or modify your build script as follows
  7. QC安装与运行中的问题汇集
  8. mysql 触发器 for each row 理解_“for each row”如何在mysql中的触发器中工作?
  9. 10 | 递归:如何用三行代码找到“最终推荐人”?
  10. Maven项目启动时如何查找默认的显示页面