【算法】LeetCode算法题-Maximum Subarray
这是悦乐书的第154次更新,第156篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53)。给定一个整数数组nums,找出一个最大和,此和是由数组中索引连续的元素组成,至少包含一个元素。例如:
输入:[-2, 1, -3, 4, -1, 2, 1, -5,4]
输出:6
说明:[4,-1,2,1]具有最大的和为6
输入:[1, 2, 3]
输出:6
说明:[1, 2, 3]具有最大的和为6
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
因为本题最后输出的是最大值,所以需要进行求和,并且要从第一位元素开始,依次和相邻元素相加来判断。
第一次循环,得到数组第一个元素,与0相加,此时最大值是元素本身。
第二次循环,得到数组第二个元素,与第一个元素相加,此时相加的和需要先判断是否大于第二个元素本身,因为如果两个数的和还没有本身大,那么此时最大和就是第二个元素本身。其次,还要和上一个和判断,如果大于第一次循环得到的和,那么新的最大和即为第一个元素和第二个元素之和或者第二个元素本身;反之最大和依旧是第一次循环后的最大和。
后面的循环与上面一致,最开始第一次的循环也是如此,为了方便对比,只是详细说明了第二次循环的处理逻辑。
public int maxSubArray(int[] nums) {
int sum = 0;
int max = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (nums[i] > sum) {
sum = nums[i];
}
if (sum > max) {
max = sum;
}
}
return max;
}
对于上面的代码,我们还可以再简化下。
public int maxSubArray2(int[] nums) {
int result = Integer.MIN_VALUE;
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum = Math.max(nums[i] + sum, nums[i]);
result = Math.max(result, sum);
}
return result;
}
03 第二种解法
还有一种思路,就是分而治之,将大问题拆分成小问题,找到小问题的答案后,最后合在一起再得出最后的答案。下面的代码是讨论区里某位大神的,可以好好看下。
public int maxSubArray3(int[] a) {
return helper(a, 0, a.length - 1);
}
int helper(int[] a, int l, int r) {
if(l > r) return Integer.MIN_VALUE;
if(l == r) return a[l];
int mid = l + (r - l)/2;
return Math.max(crossMidMax(a, l, r), Math.max(helper(a, l, mid - 1), helper(a, mid + 1, r)));
}
int crossMidMax(int[] a, int l, int r) {
int mid = l + (r - l)/2;
int lmax = a[mid], lg = a[mid];
for(int i = mid -1; i >= l; i--) {
lmax += a[i];
lg = Math.max(lmax, lg);
}
int rmax = a[mid], rg = a[mid];
for(int i = mid +1; i <= r; i++) {
rmax += a[i];
rg = Math.max(rmax, rg);
}
return lg + rg - a[mid];
}
04 小结
今天此题涉及的分而治之算法,会写在后面的算法和数据结构的理论知识介绍中,研究透彻了再和各位分享。以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
【算法】LeetCode算法题-Maximum Subarray的更多相关文章
- 【LeetCode】053. Maximum Subarray
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...
- Leetcode之53. Maximum Subarray Easy
Leetcode 53 Maximum Subarray Easyhttps://leetcode.com/problems/maximum-subarray/Given an integer arr ...
- [Leetcode][Python]53: Maximum Subarray
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 53: Maximum Subarrayhttps://leetcode.co ...
- 【LeetCode】53. Maximum Subarray (2 solutions)
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- (算法)LeetCode刷题
LeetCode 56 合并区别 Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 关键就是a[1]>=b[0] 也就 ...
- LeetCode OJ 53. Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- (LeetCode 53)Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- Leetcode No.53 Maximum Subarray(c++实现)
1. 题目 1.1 英文题目 Given an integer array nums, find the contiguous subarray (containing at least one nu ...
- 【LeetCode】53. Maximum Subarray 最大子序和 解题报告(Python & C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解法 动态规划 日期 题目地址: https:/ ...
随机推荐
- javascript小实例,在页面中输出当前客户端时间
时间对象(Date())比较简单,本文旨在为初学者入门使用,大牛可略过! 本文承接基础知识实例,说一下实例的要求: 在页面中输出当前客户端时间(2015年1月1日星期一10:10:10这样的格式),每 ...
- 深入理解JAVA中的NIO
前言: 传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致 CPU 使用效率大大降低. 所以,jdk 1.4 发布了 NIO 包,NIO 的文件读写设计颠覆了传统 IO 的设 ...
- 修改tomcat命令黑窗口的名字
一.为什么要修改tomcat黑窗口的名字 同时启动多个tomcat时,不好区分,而给tomcat的命令窗口取名区分是个不错的选择,例如下面这个效果. 二.修改的方法 1.找到tomcat的bin目录下 ...
- Java岗 面试考点精讲(基础篇01期)
即将到来金三银四人才招聘的高峰期,渴望跳槽的朋友肯定跟我一样四处找以往的面试题,但又感觉找的又不完整,在这里我将把我所见到的题目做一总结,并尽力将答案术语化.标准化.预祝大家面试顺利. 术语会让你的面 ...
- Git如何回滚代码?
摘要: 多年以后,你面对一个需要回滚的Git仓库,准会想起这篇博客. 某一天,用户跟我反馈,他不能分配任务了.我去看了一下Fundebug捕获的报错信息: 可知,出错原因是前端发送的请求参数有问题.这 ...
- 如何将字符串格式的对象转换成真正的js对象?
1.如何将字符串格式的对象转换成真正的js对象? <script>//eval 的作用eval('var a = 100');console.log(a);</script> ...
- 带你了解源码中的 ThreadLocal
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 这次想来讲讲 ThreadLocal 这个很神奇的东西,最开始接触到这个是看了主席的<开发艺术探索>,后来是在研究 Vi ...
- Atom插件安装及推荐
简介(了解更多去google或baidu) Atom 代码编辑器支持 Windows.Mac.Linux 三大桌面平台,完全免费,并且已经在 GitHub 上开放了全部的源代码.在经过一段长时间的迭代 ...
- es6 语法 (Generator)
{ // 长轮询 let ajax=function* (){ yield new Promise(function(resolve,reject){ setTimeout(function () { ...
- POI 读取 excel
xls 和 xlsx 后缀是因为 world excel 版本不一致,需要区别对待 依赖 <dependency> <groupId>org.apache.poi</gr ...