这是悦乐书的第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的更多相关文章

  1. 【LeetCode】053. Maximum Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  2. Leetcode之53. Maximum Subarray Easy

    Leetcode 53 Maximum Subarray Easyhttps://leetcode.com/problems/maximum-subarray/Given an integer arr ...

  3. [Leetcode][Python]53: Maximum Subarray

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 53: Maximum Subarrayhttps://leetcode.co ...

  4. 【LeetCode】53. Maximum Subarray (2 solutions)

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

  5. (算法)LeetCode刷题

    LeetCode 56 合并区别 Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 关键就是a[1]>=b[0] 也就 ...

  6. LeetCode OJ 53. Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  7. (LeetCode 53)Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  8. Leetcode No.53 Maximum Subarray(c++实现)

    1. 题目 1.1 英文题目 Given an integer array nums, find the contiguous subarray (containing at least one nu ...

  9. 【LeetCode】53. Maximum Subarray 最大子序和 解题报告(Python & C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解法 动态规划 日期 题目地址: https:/ ...

随机推荐

  1. React Fiber源码分析 第二篇(同步模式)

    先附上两张流程图 1.scheduleRootUpdate  这个函数主要执行了两个操作  1个是创建更新createUpdate并放到更新队列enqueueUpdate, 1个是执行sheculeW ...

  2. [转]bitcoin API reference (JSON-RPC)

    本文转自:https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29#Node.js API reference (JSON-RPC)     Co ...

  3. 介绍一款文档神器:pandoc

    http://pandoc.org/ 因为工作需要,将一批markdown的文档转换成word文档,找来找去,这个pandoc真是神器 啊,推荐给大家 If you need to convert f ...

  4. 【Java每日一题】20170217

    20170216问题解析请点击今日问题下方的“[Java每日一题]20170217”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; public cla ...

  5. python进程间通信

    Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信. 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个 ...

  6. 8.异常_EJ

    第57条: 只针对异常情况才使用异常 异常是为了在异常情况下使用而设计的,不要将它们用于普通的控制流,也不要编写迫使它们这么做的API. 第58条: 对可恢复的情况使用受检异常,对编程错误使用运行时异 ...

  7. crontab -e 怎么保存后退出?

    退出 ctrl + z

  8. laravel表单验证

    效果展示:         代码 实现: 后台: use Validator; public function login() { if($input = Input::all()){ //验证提交的 ...

  9. div添加cursor:pointer;失效问题。

    如果你不小心给其它盒子设置了z-index属性显示在最上层而又没有将该盒子进行隐藏. <style> .bottom { position: absolute; width:100px; ...

  10. CentOS 7.0 下 Python 2.7 升级到 Python 3.5

    前段因为时间工作需要,要把 Centos 7.0 默认安装的 Python 2.7 升级到 Python 3.5. 具体操作如下: # 安装 gcc gcc-c++ 等编译工具软件 yum insta ...